如何绑定
静态绑定:通过命名规则映射
1
2
3
4package com.example.nativec;
public class NativeCInf{
public static native void callNativeStatic();
}
1
2extern "C" JNIEXPORT void JNICALL
Java_com_example_nativec_NativeCInf_callNativeStatic(JNIEnv *, jclass)动态绑定:通过JNI函数注册
- 动态绑定可以在任何时刻触发
- 动态绑定之前根据静态规则查找Native函数
- 动态绑定可以在绑定后的任意时刻取消
1
2
3
4
5
6
7
8
9
10int registerMethods(JNUEnv *env, const char *className, const JNINativeMethod *methods, int methodsLength){
//获取Class
jclass clazz = env -> FindClass(className);
if(clazz == NULL) return JNI_ERR;
//注册方法
if((env -> RegisterNative(clazz, methods, methodsLength)) < 0){
return JNI_ERR;
}
return JNI_OK;
}
动态和静态绑定对比
动态绑定 | 静态绑定 | |
---|---|---|
Native函数名 | 无需求 | 按照固有规则编写且采用C的名称修饰规则 |
Native函数可见性 | 无需求 | 可见 |
动态更换 | 可以 | 不可以 |
调用性能 | 无需查找 | 有额外的查找开销 |
开发体验 | 几乎无副作用 | 重构代码时较为繁琐 |
Android Studio支持 | 不能自动关联跳转 | 自动关联JNI函数可跳转 |