美文网首页
JNI容易踩坑的细节记录

JNI容易踩坑的细节记录

作者: 谢俊烽 | 来源:发表于2019-12-31 17:58 被阅读0次

    一、关于sig签名

       const char * sig = "(Ljava/lang/String;I)V";
        jmethodID setNameAndAge = env->GetMethodID(student_class, "setNameAndAge", sig);
        jstring name2 = env->NewStringUTF("小学生");
        env->CallVoidMethod(student, setNameAndAge, name2, 88);
    

    这个方法传了2个参数,第一个是String:Ljava/lang/String;,第二个是int:I;
    切记中间不能有空格;

    二、构造方法获取

    //获取有参数的构造方法
        const char *sig = "(Ljava/lang/String;I)V";
    //    const char *method = "<init>";
        jstring name = env->NewStringUTF("小学生");
        jmethodID init = env->GetMethodID(studentClass, "<init>", sig);
        jobStudent = env->NewObject(studentClass, init, name, 31);
    

    其中GetMethodID(studentClass, "<init>", sig);第二个参数可以不用const char *method = "<init>";虽然会爆红,因为java代码找不到这个方法名,但是可以运行,建议还是写个method吧,去掉红色的强迫症。

    三、全局释放

     env->DeleteGlobalRef(studentClass);
        studentClass = NULL;
    

    第二行必须加上,不然就是会出现悬空指针;

    四、关于return

    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *javaVm, void *pVoid) {
    //    return JNI_VERSION_1_6;
    }
    

    如果没有return是不会爆红的但是,你会找不到bug然后疯掉。。。

    void method(JNIEnv *env, jobject instance, jstring text) {
    }
    

    这个是可以不用return的,但是下面这个

    void * method(JNIEnv *env, jobject instance, jstring text) {
          return 0;
    }
    

    是要return 的,而且只能return 0;不然,呵呵。。。

    五、关于JNIEnv的获取

    jint result = javaVm->GetEnv(reinterpret_cast<void **>(&jniEnv), JNI_VERSION_1_6);
    jint result = javaVm->AttachCurrentThread(&jniEnv, 0);//线程中获取
    

    在线程中获取是要第二行写法,不然会获取不到

    相关文章

      网友评论

          本文标题:JNI容易踩坑的细节记录

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