使用JNI异步调用Java方法
我一直在努力熟悉JNI及其功能。我试图弄清楚我如何能够保持对Java环境的引用。我首先调用存储从jobject创建“NewGlobalRef”的本机方法,它可以正常工作一段时间。但我突然收到致命错误和日志。我很确定垃圾收集器会删除一些东西,即使我一直在两边引用对象 我现在做的是这个 我称之为本机方法使用JNI异步调用Java方法,java,c++,java-native-interface,Java,C++,Java Native Interface,我一直在努力熟悉JNI及其功能。我试图弄清楚我如何能够保持对Java环境的引用。我首先调用存储从jobject创建“NewGlobalRef”的本机方法,它可以正常工作一段时间。但我突然收到致命错误和日志。我很确定垃圾收集器会删除一些东西,即使我一直在两边引用对象 我现在做的是这个 我称之为本机方法 myCoolObject.nativeMethod(otherCoolObject); 我一直在java端引用otherCoolObject。本机方法所做的是 JNIEXPORT void JNI
myCoolObject.nativeMethod(otherCoolObject);
我一直在java端引用otherCoolObject。本机方法所做的是
JNIEXPORT void JNICALL Java_HelloWorld_nativeMethod(JNIEnv *env, jobject obj , jobject otherCoolObject) {
cout << "Called native method!" << endl;
coolObj = env->NewGlobalRef(otherCoolObject);
clazz = (*env).GetObjectClass(coolObj;
callbackEnv = env;
methodId = (*env).GetMethodID(clazz, "callback", "(II)V");
jint x = 1;
jint y = 2;
(*callbackEnv).CallVoidMethod(coolObj, methodId, x, y);
}
JNIEXPORT void JNICALL Java\u HelloWorld\u nativeMethod(JNIEnv*env、jobject obj、jobject otherCoolObject){
cout您不能重用JNIenv,因为它特定于创建它的函数(线程、范围和所有)。
为了获得从回调调用java方法的有效JNIenv,您必须
使用JNI_GetCreatedJavaVMs()和AttachCurrentThread()
更多信息请点击此处:
您不能重用JNIenv,因为它特定于创建它的函数(线程、范围和所有)。
为了获得从回调调用java方法的有效JNIenv,您必须
使用JNI_GetCreatedJavaVMs()和AttachCurrentThread()
更多信息请点击此处:
如果我尝试使用JNI\u GetCreatedJavaVMs(),我只会得到“未定义的对`\u imp\u JNI的引用”_GetCreatedJavaVMs@12“上面的错误代码发现这个线程可能很有用:在我创建全局引用后,它开始工作,但过了一段时间,它会产生新的致命错误。你是最好的!在玩了第二次之后,它开始工作了。”(我不太擅长C语言:<)如果我尝试使用JNI\u GetCreatedJavaVMs(),我只会得到“对`\u imp\u JNI的未定义引用”_GetCreatedJavaVMs@12'"上面的错误代码发现这个线程可能很有用:在我创建了全局引用之后,它开始工作,但是过了一段时间,它会产生新的致命错误。你是最好的!在第二次使用它之后,它开始工作了(我对C语言不太熟悉:<)我是jni新手,使用callbackEnv的目的是什么?我们不能继续使用(*env).CallVoidMethod吗(coolObj,methodId,x,y);?我是jni新手,使用callbackEnv的目的是什么?我们不能继续使用(*env)。CallVoidMethod(coolObj,methodId,x,y)??