我一直在尝试熟悉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/

10-11 22:43
查看更多