基本数据类型对照表
Java类型 | C语言类型 | JNI对应的类型 |
---|---|---|
int | long | jint |
long | _int64 | jlong |
byte | signed char | jbyte |
boolean | unsigned char | jboolean |
char | unsigned short | jchar |
short | short | jshort |
float | float | jfloat |
double | double | jdouble |
静态注册
这是很多例子用的最多,也是最为常见的一种方式。
原理
根据声明的java本地方法生成的头文件规则,通过函数名的对应关系来达到
java声明:
|
|
jni生成的头文件声明:
|
|
- 结论
(1). 如果有文件位置改动,文件名,函数名的改动的话,后期就比较麻烦
(2). 函数名长度过长,可读性差,不便维护
动态注册
前面一种方式或许只是局限在demo层面,而后一种实现方式则更多的用到实际项目中
Java调用本地函数,一般是透过VM去so文件查找相应的本地函数,如果需要连续调用多次,每次都需要查找一遍,这将是相当花时间的; 这时候开发者就可以自行借助JNI_Onload函数动态注册本地函数
原理
告诉JVM native函数在JNI中对应的函数指针,支持函数名自定义
|
|
函数映射表
在这里声明各个函数间的对应关系
|
|
最后
当你调用System.loadLibrary, VM首先执行到JNI_OnLoad,动态方式藉由此方法告知VM我们要注册的一系列本地函数,以及一些初始化操作,以便后续加快调用本地函数的效率