JNI容易踩坑的细节记录

2019-12-31  本文已影响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);//线程中获取

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

上一篇 下一篇

猜你喜欢

热点阅读