JNI容易踩坑的细节记录

一、关于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);//线程中获取

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 0.要素1.类操作2.异常操作3.全局及局部引用4.对象操作5.字符串操作6.数组操作7.访问对象的属性和方法7....
    MagicalGuy阅读 5,224评论 0 2
  • jni 操作 java 类 DefineClassjclass DefineClass(const char *n...
    efan阅读 3,365评论 0 1
  • 要使用NDK首先要了解NDK到底是什么? (英语:native development kit,简称NDK)是一种...
    cuiandroid阅读 6,776评论 0 2
  • 什么是JNI? JNI 是java本地开发接口.JNI 是一个协议,这个协议用来沟通java代码和外部的本地代码(...
    a_tomcat阅读 7,819评论 0 54
  • 1.在C/C++中实现本地方法 生成C/C++头文件之后,你就需要写头文件对应的本地方法。注意:所有的本地方法的第...
    JayQiu阅读 7,124评论 0 3

友情链接更多精彩内容