我一直在尝试熟悉JNI及其功能。我试图弄清楚如何继续引用Java环境。我首先调用存储的本地方法,该方法从jobject创建“ NewGlobalRef”,并且可以正常工作一段时间。但是随后突然我收到致命错误并记录日志。我很确定垃圾收集器会删除某些内容,即使我一直在两边一直引用该对象。
我正在做的atm是这个
我叫原生方法
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);
}
我可以在此之后调用该方法一段时间,但是突然之间,它给了我致命的错误,我告诉过您
最佳答案
您不能重用您的JNIenv,因为它特定于创建它的函数(它是线程,作用域和全部)。
为了获得有效的JNIenv以便从回调中调用Java方法,您必须
使用JNI_GetCreatedJavaVMs()和AttachCurrentThread()
更多信息在这里:
http://docs.oracle.com/javase/1.3/docs/guide/jni/spec/invocation.doc.html
关于java - 使用JNI异步调用Java方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9995148/