-
静态绑定
以打开串口的方法为例:
-
JIN
-
Java
-
JNIEXPORT,强制Native函数可见。
jobject,表示方法返回类型为一个对象,如果不返回则为
void
。JNICALL,表示了函数的调用规范,比如参数入栈方式是从左往右,还是从右往左等。
Native函数中的以
Java_
开头后跟的com_pfg_mallstore_serialport
与Java类包名对应,只是将.
换成了_
Native函数中包名后紧跟类名,与Java方法所在类对应
-
Native函数参数
JNIEnv,指Java本地接口环境(Java Native Interface Environment),指向了本地方法的一个函数表。
jclass、jobject,jclass表示当前方法是静态方法,jobject表示当前方法是非静态方法。
jstring、jint...等,与Java中String、int类型一一对应。
-
动态绑定
-
动态绑定流程:
在Native层调用FindClass方法获取到需要绑定的Java类。
在Native层调用RegisterNatives 方法传入Java类、方法列表和绑定方法数量。
-
- 动态绑定优点:
- 可以在任意时刻触发。
- 绑定之前根据静态规则查找Native函数。
- 可以在绑定后的任意时刻取消。
静态绑定和动态绑定对比
静态绑定 | 动态绑定 | |
---|---|---|
Native函数名 | 按照固有规则编写并采用C的命名规则 | 无要求 |
Native函数可见性 | 可见 | 无要求 |
动态更换 | 否 | 能 |
调用性能 | 额外查找开销 | 无需查找 |
开发影响 | 重构繁琐(例如:修改函数名,需两边同时改) | 几乎无副作用 |
AndroidStudio支持 | 自动关联Native函数跳转 | 不能自动关联 |