一、关于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);//线程中获取
在线程中获取是要第二行写法,不然会获取不到
网友评论