一、简介
JNI全称是Java Native Interface(Java本地接口)单词首字母的缩写,本地接口就是指用C和C++开发的接口。由于JNI是JVM规范中的一部份,因此可以将我们写的JNI程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/C++写的大量代码。
开发JNI程序会受到系统环境的限制,因为用C/C++语言写出来的代码或模块,编译过程当中要依赖当前操作系统环境所提供的一些库函数,并和本地库链接在一起。而且编译后生成的二进制代码只能在本地操作系统环境下运行,因为不同的操作系统环境,有自己的本地库和CPU指令集,而且各个平台对标准C/C++的规范和标准库函数实现方式也有所区别。这就造成使用了JNI接口的JAVA程序,不再像以前那样*的跨平台。如果要实现跨平台,就必须将本地代码在不同的操作系统平台下编译出相应的动态库。
JNI开发流程主要分为以下5步:
1、创建一个类(HelloJNI.java)声明本地方法
2、将Javac编译源文件HelloJNI.java,生成HelloJNI.class。
3、用javah -jni命令生成HelloJNI.h头文件(javah是jdk自带的一个命令,-jni参数表示将class中用native声明的函数生成jni规则的函数)
4、用本地代码实现HelloJNI.h头文件中的函数
5、将本地代码编译成动态库(windows:*.dll,linux/unix:*.so,mac os x:*.jnilib)
二、项目实战
- 通过eclipse新建一个HelloJNI的android项目,并且在该项目的根目录新建jni文件夹。如图1:
2. 新建一个HelloJNI.java文件并声明native方法,如图:
3. 用javac命令将.java源文件编译成.class字节码文件
注意:-d 表示将编译后的class文件放到指定的目录下,这里把它放到和src同级的bin目录下
4. 用javah -jni命令,根据class字节码文件生成.h头文件(-jni参数是可选的)
也可以通过-o参数指定生成头文件名称:
参数说明:
-classpath :类搜索路径,这里表示从当前的bin目录下查找
-d :将生成的头文件放到当前的jni目录下
-o : 指定生成的头文件名称,默认以类全路径名生成(包名+类名.h)
注意:-d和-o只能使用其中一个参数
5. 用本地代码实现.h头文件中的函数
6. 将C/C++代码编译成本地动态库文件在android中将jni代码编译成动态库,需要添加Android.mk文件,如下:
7. 编译apk文件,也需要添加Android.mk文件,如下:
编译结果如下:
将HelloJNI.apk推动系统/system/app目录,将libHelloJNI.so推动系统/system/lib目录,然后启动应用,运行结果如下:
代码参考:https://github.com/gunder1129/android-tool/tree/master/HelloJNI