JNI:Java Native Interface ,编译型语言。作用:Application层通过jni层来访问底层系统。说白了,JNI就是一座沟通的桥梁,这也就保证了Java语言在各种不同系统中能够访问本地方法。
在windows平台下编译的文件:
.dll:动态链接库,作为共享函数库的可执行文件
.obj:目标文件,相当于源代码对应的二进制文件,未经过重定义(类似java中的class文件,属于中间型文件)
.lib:静态链接库,可理解为多个obj的集合
在linux平台下编译的文件:
.so 动态链接库 与.dll类似
.o:类似.obj
.a 静态链接库 类似多个.o的集合
通过CmakeList.txt来配置动态库和静态库(这里使用的工具是Clion)
SHARED:共享,动态库,优点:运行时加载,可执行文件体积小,动态函数库改变时不需要重新加载,方便动态库的升级。
STATIC:静态库,优点:由于是提前编译并整合进代码中,运行时不需要外部的函数库支持
jni注册方式分为两种:
一、静态注册,分为几个步骤
1.定义一个java类,类中声明native方法
2.利用javac命令把对应的java文件生成class文件
3.利用javah生成.h头文件
注意:1.8版本之前的jdk需要回退到上级目录,然后使用全类名来生成(全类名=包名+类名)
1.8之后的jdk可以直接在类的当前目录下使用 javac -h . XXX.java命令生成.class和.h文件
4.打开Clion工具创建一个C++ Library工程 并把.h文件复制到当前工程中,配置CmakeLIst,并创建一个.c文件来实现头文件 中的方法,然后build工程,Clion配置的mingw环境必须要和当前eclipse使用的jdk版本相同(64位或32位),否则会报错。
5.把生成出来的.dll文件的路径配置到java类中,然后可以调用
二、动态注册
1.同样创建一个java类,声明native方法
2.在C++的library工程里创建一个.c文件 里面实现2个方法 返回值对应java类的返回值,方法名不必对应
3.实现jni.h头文件里的OnLoad方法
并声明变量 mClassName(当前对应java类的全类名)
以及结构体数组mMethods(用于绑定java类的方法以及c实现的方法),绑定格式 "java类名","(方法参数)返回值","指向C的方法的指针"
4.CmakeList里面添加工程
5.生成dll文件,java类中声明加载路径,调用即可。
相比较,动态注册的优点:方法名不必一一对应,灵活。。