美文网首页Android NDK开发
NDK开发(七)--静态注册和动态注册

NDK开发(七)--静态注册和动态注册

作者: 骑着蜗牛闯世界666 | 来源:发表于2019-11-24 23:12 被阅读0次

    简介

    在开发NDK 工程的时候,我们在java层调用一个native方法的时候,虚拟机怎样知道应该调用到so里面的哪个方法呢?这里就用到了另外一个概念注册,通过注册,可以将指定的native方法和so里面对应的方法绑定起来。注册分为静态注册动态注册。一般我们用到的都是静态注册

    静态注册

    通过JNIEXPORT和JNICALL这两个宏进行定义声明,在虚拟机加载so的时候,跟根据定义的函数找到对应的native方法。

    extern "C" JNIEXPORT jstring JNICALL
    Java_com_canter_ndkdemo4_MainActivity_stringFromJNI(
            JNIEnv *env,
            jobject /* this */) {
        std::string hello = "Hello from C++";
        nullPointCrash();
        return env->NewStringUTF(hello.c_str());
    }
    

    譬如上面的例子,因为函数的定义,是根据对应的native方法的类路径和类名来生成的,所以能够直接映射找到对应的native方法。

    动态注册

    通过 registerNatives 方法手动完成 native 方法和 so 中的方法的绑定,这样虚拟机就可以通过这个函数映射表直接找到相应的方法。
    动态注册好处是不需要写很长的方法名,用jni_onload方法实现预注册 即当执行system.loadLibrary()方法时候就把需要调用的方法给注册了,运行效率上会比较高。
    注册步骤:

    • 重写JNI_OnLoad方法;
    • 注册Java端的方法 以及本地相对应的方法
    • 注册相应的类以及方法
    • 声明并实现对应的c层对应的方法

    具体代码如下

    //替换java端的testVoid
    void native_void() {
    LOGV("调用了native_void,是java 层对应的testVoid方法");
    }
    
    //替换java端的testInt
    int native_testInt() {
    return 200;
    }
    
    //注册Java端的方法  以及本地相对应的方法
    JNINativeMethod method[] = {{"testVoid", "()V", (void *) native_void},
                            {"testInt",  "()I", (int *) native_testInt}};
    
    //注册相应的类以及方法
    jint registerNativeMeth(JNIEnv *env) {
    jclass cl = env->FindClass("com/canter/ndkdemo5/MainActivity");
    if ((env->RegisterNatives(cl, method, sizeof(method) / sizeof(method[0]))) < 0) {
        return -1;
    }
    return 0;
    }
    
    //实现jni_onload 动态注册方法
    jint JNI_OnLoad(JavaVM *vm, void *reserved) {
    JNIEnv *env = NULL;
    if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
        return -1;
    }
    if (registerNativeMeth(env) != JNI_OK) {//注册方法
        return -1;
    }
    return JNI_VERSION_1_4;//必须返回这个值
    }
    

    源码详见 github里面的NDKDemo5

    相关文章

      网友评论

        本文标题:NDK开发(七)--静态注册和动态注册

        本文链接:https://www.haomeiwen.com/subject/swirwctx.html