Android Studio JNI开发-1

2017-05-25  本文已影响80人  lengyan_zhao

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实际开发!

上一篇下一篇

猜你喜欢

热点阅读