JNI和NDK的区别:
1、什么JNI
Java Native Interface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机(VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。
上面过程分为2个部分:
第一、用C语言生成一个库文件。
第二、在java中调用这个库文件的函数。
2、NDK
NDK全称:Native Development Kit。
NDK是一系列工具的集合。
* NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
* NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
* NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
jni的具体开发步骤:
第一步:
在AS上创建空项目AndroidNDK,和其他正常创建项目一致;
第二步:
选择项目设置ndk路径(如果之前没有下载过ndk,该界面会有下载链接):
第三步
在根目录下的gradle.properties文件下面添加设置:android.useDeprecatedNdk=true,如果不加的话,会直接报错:
第四步
在main文件夹下面添加jni文件夹,并且添加对应的.c文件和empty.c(网上说不添加空的.c文件会报错,但是我并没有报错)
第五步
创建对应的.h文件,首先创建对应的本地方法的类(将所有可能用到的本地方法都尽可能写到该类中,这样就可以降低耦合度),写好对应的native方法之后,build项目,然后在..\build\intermediates\classes\debug目录下(可以找到创建的类的.class文件),执行命令:
javah -jni (类全名)
就可以生成对应的.h文件,将该文件复制到第四步中创建的jni文件夹下面即可。
第六步
在当前jni开发模块下的build.gradle文件中配置.so文件的信息:
moduleName:表示so文件的模块名称;
ldLibs://添加log依赖库文件
abiFilters://表示不同的cpu类型
完成之后,就可以编译生成对应的.so文件在..\build\intermediates\ndk 下就可以看到;
第七步
在创建的本地方法类中静态加载so文件:
/**
* 静态加载.so文件
* 注意加载的so文件名称和build.gradle中的moduleName保持一致
* 即没有lib前缀的文件名
*/
static{
System.loadLibrary("fm");
}
第八步
在jni对应的.c方法中编写测试方法,判断是否调用成功!
/*
* Class: com_fmblzf_androidndk_ndk_AndroidNDK
* Method: test
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_fmblzf_androidndk_ndk_AndroidNDK_test
(JNIEnv *env,jobject obj,jstring str){
return(*env)->NewStringUTF(env,"调用成功!");
}
测试通过!!!
至此jni的开发环境以及基本的配置寂静完成!
接下来会继续编写jni实际开发!