2012-04-03 161 views
0

我一直在努力熟悉JNI及其功能。我想弄清楚我怎么可能继续参考Java环境。我首先调用本地方法,商店从jobject创建“NewGlobalRef”,并且它在一段时间内工作正常。但突然之间我收到致命的错误和日志。我非常确定垃圾收集器会删除某些东西,即使我始终在双方中始终引用该对象。使用JNI异步调用Java方法

我在做什么大气压是这个

我调用本地方法

myCoolObject.nativeMethod(otherCoolObject); 

我保持参照otherCoolObject所有在Java方面的时间。什么本地方法的作用是

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); 
} 

并在此之后,我可以调用这个方法一段时间,但所有的突然它给了我致命的错误,我告诉你关于

回答

3

你就无法再使用的JNIEnv,原因它是特定于创建它的函数(它是线程,范围和全部)。 为获得一个有效的JNIEnv调用从回调的Java方法,你必须 使用JNI_GetCreatedJavaVMs()和AttachCurrentThread()

更多信息这里: http://docs.oracle.com/javase/1.3/docs/guide/jni/spec/invocation.doc.html

+0

如果我尝试使用JNI_GetCreatedJavaVMs()我只得到“未定义引用'_imp__JNI_GetCreatedJavaVMs @ 12'”上面的错误代码 – Ruuhkis 2012-04-03 14:35:09

+0

发现此线程可能会有用:http://www.velocityreviews.com/forums/t130983-call-java-method-from-c-jni.html – shem 2012-04-03 15:00:36

+0

After我创建了全球参考它开始工作,但一段时间后,它会产生新的致命错误 – Ruuhkis 2012-04-03 15:06:59