2012-04-03 160 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