想要学习一下在Android Studio中进行JNI的开发,文章挺多的,但是几乎没有一个完整的说明的,中间总是有一两步漏掉。分享技术就应该完整的让读者学会,藏着掖着不是君子所为。对于那些故意含糊过去的,我只想说Navie!

转载请注明出处 http://www.cnblogs.com/qiusuo/p/5656625.html

正文

JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。

Android NDK(Native Development Kit )是一套工具集合,允许你用像C/C++语言那样实现应用程序的一部分。

  1. 在使用NDK之前需要配置NDK和LLDB
    通过使用SDK Manager找到NDK和LLDB,进行安装
  2. 按照一般方法,创建一个Android应用
    File - New - New Project

  3. 创建一个新的Java Class(与MainActivity一个目录),类名为JniDemo,其中有一个Native方法
    package com.example.angel.myapplication;
    
    /**
    * Created by Angel on 2016/7/8.
    */
    public class JniDemo {
    public native String getJniMessage();
  4. 编译JniDemo.java这个带有Native方法的类
    在命令提示符中,cd到文件所在目录,执行javac JniDemo.java,可以看到目录中生成了对应的.class文件
  5. 生成对应的.h头文件
    a) 在命令提示符中,cd到src/main/java文件夹中(内部的目录结构是包名,例如我的包名是com.example.angel.myapplication,目录结构为/src/main/java/com/example/angel/myapplication)
    b) 执行javah com.example.angel.myapplication.JniDemo,会在当前目录生成head file(.h)文件。
  6. 在Project树形目录下app - src - main,建立jni folder,并将head file放到里边
  7. 在jni文件夹中创建C/C++源文件,并include这个头文件,实现其中的方法。
    #include "com_example_angel_myapplication_JniDemo.h"
    JNIEXPORT jstring JNICALL Java_com_example_angel_myapplication_JniDemo_getJniMessage
    (JNIEnv *, jobject)
    {
    return (*env)->NewStringUTF(env,"Jni Message: Hello World!");
    }
  8. build - Rebuild Project后,会出现一个错误。并且给出了解决方案:Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.
    在gradle.properties中添加一行android.useDeprecatedNdk=true
  9. build - Rebuild Project后,又会出现warming,NDK option is not configured。按照提示,进行如下内容的添加:
    在app的build.gradle文件中,添加如下内容:
    android {
    sourceSets {
    main {
    jniLibs.srcDir 'src/main/jni'
    }
    }
    }

    并且自定义so库的名称

    android {
    ......
    defaultConfig {
    ......
    ndk {
    moduleName 'jnidemo'//自定义名称
    }
    }
    }

    如果不这么做的话,生成的库文件名称是[lib][module name].so

  10. build - Rebuild Project,可以看到生成了so文件
    在目录:app - build - intermediates - ndk - debug - lib下
  11. 加载so文件。
    so文件加载一次便可以使用,一般情况下,在静态代码段中进行加载
        static {
    System.loadLibrary("jnidemo");
    }
  12. 使用Native方法
    public class MainActivity extends AppCompatActivity {
    static {
    System.loadLibrary("jnidemo");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); final JniDemo jniDemo = new JniDemo();
    TextView textView = (TextView) findViewById(R.id.text);
    textView.setText(jniDemo.getHelloWordText());
    }
  13. Native方法使用java代码
    在Java代码中,创建如下方法,用以在Native代码中调用
        protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sContext = getApplicationContext();
    }
    private static Context sContext;
    public static void showToast() {
    Toast.makeText(sContext, "此方法由Native方法调用", Toast.LENGTH_SHORT).show();
    }

    在Native代码中,使用如下代码进行调用

        //找到我们要调用的方法,注意包名+类名
    jclass clazz = (*env)->FindClass(env,"com/example/angel/myapplication/MainActivity");
    //获取某个静态方法的ID
    //clazz 是我们上面找到的类的字节码文件
    //showToast 是clazz类中的方法名
    //"()V" 这个表示方法的签名;()是方法的参数列表;V表示方法的返回类型;V -> void
    jmethodID id = (*env)->GetStaticMethodID(env,clazz, "showToast","()V");
    //最后调用这个方法,CallStaticVoidMethod(clazz,方法ID)
    (*env)->CallStaticVoidMethod(env,clazz,id);

Android Studio使用JNI和NDK进行开发的更多相关文章

  1. Android Studio通过JNI调用NDK程序

    NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些,安全性更高. 如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配 ...

  2. 使用Android Studio自带的NDK编译JNI

    /********************************************************************************** * 使用Android Stud ...

  3. Android studio 配置JNI环境

    Android studio配置jni开发环境,主要配置是两个build文件,以及新建一个jni文件,放c代码. 代码如下1: apply plugin: 'com.android.model.app ...

  4. Android studio 下JNI编程实例并生成so库

    Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...

  5. Android Studio && GitHub 团队多人一起开发

    曾几何时,花了两天的时间搞了合并项目,搞得乱七八糟der,但最终还是被我搞定了,too 乱 to 做笔记.过了几个月,也就是前几天,抱着从头开始的决心,再次尝试,然鹅并没有结果.今天,再一次重新开始, ...

  6. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...

  7. [Android] AndroidStudio + JNI(NDK)开发相关总结

    1.官方推荐JNI构建方案 从Android studio 2.2 开始,Google推荐的JNI开发构建工具是CMake而不是NDK,参考官方文档:https://developer.android ...

  8. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  9. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

随机推荐

  1. 1o_Samba

    ∮Linux下Samba的安装配置 §Linux 下文件共享软件 Samba 是一款实现跨主机,跨平台文件共享的软件.同类型的软件还有 ftp,nfs 不再赘述. §文件共享协议 Windows : ...

  2. 揭秘 typedef四用途与两陷阱[转]

    自 http://niehan.blog.techweb.com.cn/archives/325.html typedef用来声明一个别名,typedef后面的语法,是一个声明.本来笔者以为这里不会产 ...

  3. JS学习之路(这个觉得写的很好,放在这里是方便查看)

    总则-都是对象,都是引用 在接触js前用的比较多的是java,在刚开始接触js的时候,老实讲,我是有点崩溃的,相信许多像我一样从后端语言向js转的童鞋们肯定有一样的感受,这玩意儿太灵活了,好像怎么样都 ...

  4. ORACLE 自治事物

    ORACLE 自治事物 一.问题 (1)现象   一个表A,存在一个触发器,该触发器用来统计表A的数量,并将结果更新到B表.此时,java代码里面调用insert into select 语句,会发生 ...

  5. javascript判断对象

    var assert = require('chai').assert; describe('Array', function() { describe('#indexOf()', function( ...

  6. 设计winform自带动态加载工具按钮和实现热键响应

    1.初衷 主要是想设计一个自带添加工具按钮和按钮的快捷键的基窗体.这样以后所设计的窗体只要继承自这个窗体就可以实现热键响应和动态加工具按钮的功能了 写这边文章主要是为了以后使用的时候有个参考,因为这只 ...

  7. 16.2.2 Space Needed for keys

    myisam表使用btree索引,可以粗略计算出索引文件的大小,使用(key_length+4)/0.67,全部key的总和,全部key被排序顺序插入和表没有被任何压缩的时候,这是最坏的情况 stri ...

  8. pip 安装 MySQL-python 失败

    今天在安装 MySQL-python 提示 EnvironmentError: mysql_config not found 得知 mysql_config 是属于MySQL开发用的文件,而使用apt ...

  9. CSS3学习内容与心得

    今天2005年7月9号,博客这个东西还真不懂,以前吧我不认识它,它也不认识我.没辙,汤老要我们写,就写吧. 写什么好呢?那就写今天学习的css3的一些要点吧. css这门课程几乎都学完了.而我觉得我还 ...

  10. Unity3D 物体移动方式

    1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在 ...