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。這是正常的還是我可以忽略它?
假設'glJniContext.pJvm'有效,代碼看起來很好。 (您可能想檢查'GetJavaVM'和'AttachCurrentThread'的返回值。)logcat輸出在崩潰時顯示什麼? (在ADT/DDMS中使用'adb logcat'或logcat視圖。) – fadden
感謝您的建議。我檢查過'AttachCurrentThread'和'GetJavaVM',它們的返回值是0(正常)。很奇怪,程序今天正常運行,也就是說它不會崩潰。代碼沒有改變,只是電腦和設備都重新啓動。所以我沒有直接的方法來分析原因。 – johnnyfee
@johnnyfee突然,我在我的一個項目中遇到了同樣的症狀:'findClass'返回0,'DetachCurrentThread'失敗。你是否設法解決你的情況? – deko