2013-07-15 26 views
3

我有一個由我公司開發的私有庫。它允許我設置回調函數,所以在長時間操作完成後,回調將在子線程中調用。通話後崩潰DetachCurrentThread

我應該在回調中操作JVM。這是我在回調函數主要代碼:

JNIEnv *pEnv = NULL; 
glJniContext.pJvm->AttachCurrentThread(&pEnv, NULL); 
UiInkeyMsInternal(pEnv, 10000000); 
glJniContext.pJvm->DetachCurrentThread(); 

AttachCurrentThread是子線程連接到JVM中,UiInkeyMsInternal是調用Java方法和DetachCurrentThread是分離的子線程JVM和glJniContext.pJvm被存儲在本地方法方法是這樣的:

JavaVM* gs_jvm; 
pEnv->GetJavaVM(&gs_jvm); 
glJniContext.pJvm = gs_jvm; 

隨着線glJniContext.pJvm->DetachCurrentThread();,該程序將崩潰。但沒有線路,這是正常的。如何分析這種現象?

另一個問題,我可以通過AttachCurrentThread方法正常得到JNIEnv變量,但findClass方法不能正常執行。無論我傳遞什麼,比如「java/lang/Thread」,它將返回0x00。這是正常的還是我可以忽略它?

+0

假設'glJniContext.pJvm'有效,代碼看起來很好。 (您可能想檢查'GetJavaVM'和'AttachCurrentThread'的返回值。)logcat輸出在崩潰時顯示什麼? (在ADT/DDMS中使用'adb logcat'或logcat視圖。) – fadden

+0

感謝您的建議。我檢查過'AttachCurrentThread'和'GetJavaVM',它們的返回值是0(正常)。很奇怪,程序今天正常運行,也就是說它不會崩潰。代碼沒有改變,只是電腦和設備都重新啓動。所以我沒有直接的方法來分析原因。 – johnnyfee

+0

@johnnyfee突然,我在我的一個項目中遇到了同樣的症狀:'findClass'返回0,'DetachCurrentThread'失敗。你是否設法解決你的情況? – deko

回答

1

不要從主thread調用JNI handler function。從主線程調用JNI handler function將導致崩潰。