Native方法与Native函数怎么绑定的

如何绑定

  • 静态绑定:通过命名规则映射

    1
    2
    3
    4
    package com.example.nativec;
    public class NativeCInf{
    public static native void callNativeStatic();
    }

    1
    2
    extern "C" JNIEXPORT void JNICALL
    Java_com_example_nativec_NativeCInf_callNativeStatic(JNIEnv *, jclass)
  • 动态绑定:通过JNI函数注册

    • 动态绑定可以在任何时刻触发
    • 动态绑定之前根据静态规则查找Native函数
    • 动态绑定可以在绑定后的任意时刻取消
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int 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函数可跳转