介绍一下 JNI
一 JNI
定义:java Native Interface,即java本地接口,本地接口就是指用C和C++开发的接口。由于JNI是JVM规范中的一部分,因此可以将我们写的JNI程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/C++写的大量代码。
开发JNI程序会受到系统环境的限制,因为用C/C++语言写出来的代码或模块,编译过程当中要依赖当前操作系统环境所提供的一些库函数,并和本地库链接在一起。而且编译后生成的二进制代码只能在本地操作系统的环境下运行,因为不同的操作系统环境,有自己的本地库和CPU指令集,而且各个平台对标准C/C++的规范和标准库函数实现方式也有所区别。这就造成使用了JNI接口的JAVA程序,不再像以前那样自由的跨平台。如果要实现跨平台,就必须将本地代码在不同的操作平台下编译出相应的动态库。
作用:使得java与本地其他类型语言(如c、c++)交互
即在java代码里调用c、c++等语言的代码或c、c++代码调用java代码。
JNI开发流程主要分为以下6步:
1.编写声明了native方法的Java类
2.将Java源代码编译成class字节码文件
3.用javah -jni命令生成.h头文件(javah是jdk自带的一个命令,-jni参数表示将class中用native声明的函数生成JNI规则的函数)
4.用本地代码实现.h文件中的函数
5.将本地代码编译成动态库(Windows:\*.dll,linux/unix:\*.so,mac os x:\*.jnilib)
6.拷贝动态库至java.library.path本地库搜索目录下,并运行Java程序。
特别注意:
1、JNI是java调用Native语言的一种特性
2、JNI是属于java的,与Android无直接关系
为什么要有JNI?
实际使用中,java需要与本地代码进行交互,因为java具备跨平台的特点,所以java与本地代码交互能力非常弱,所以采用JNI特性增强java与本地代码交互的能力。
实现步骤
1、在java中声明Native方法(即需要调用的本地方法)
2、编译上述java源文件javac(得到.class文件)
3、通过javah命令导出JNI的头文件(.h文件)
4、使用java需要交互的本地代码 实现在java中声明的Native方法
如java需要与c++交互,那么就用c++实现java的Native方法
5、编译.so库文件
6、通过java命令执行java程序,最终实现Java调用本地代码