2016-02-25 221 views
1

爲什麼我的Android應用程序在我的線程退出時崩潰?當我的線程退出時,爲什麼我的Android應用程序崩潰?

logcat當我的應用程序崩潰時,我看到以下輸出。

D/dalvikvm: threadid=13: thread exiting, not yet detached (count=0) 
D/dalvikvm: threadid=13: thread exiting, not yet detached (count=1) 
E/dalvikvm: threadid=13: native thread exited without detaching 
E/dalvikvm: VM aborting 

我不確定是什麼線程導致這種情況。該應用程序使用帶有少數STL線程實例的C++庫(std::thread)。下面是如何我線程庫工作的一個例子:

std::thread thread([context]() { ... }); 
thread.detach(); 

庫工程沒有在iOS,OS X和Linux的任何此類錯誤。我的猜測是錯誤不是因爲缺少對std::thread::detach的呼叫。

不知道這是相關的:

  • 我用gnustl_static
  • 庫通過NDK集成,但低級別的代碼是平臺無關的,所以我不打電話JavaVM::AttachCurrentThreadJavaVM::DetachCurrentThread

我不知道該做什麼或尋找什麼。

+1

看着這個鏈接http://stackoverflow.com/questions/26534304/android-jni-call-attachcurrentthread-without-detachcurrentthread。您的logcat與分離前退出的線程的源代碼中的錯誤消息相匹配。對不起,如果這沒有幫助。 –

回答

2

那麼,東西打電話AttachCurrentThread。如果什麼都沒有,虛擬機不會意識到線程是否退出。

任何使JNI調用的線程必須首先連接到VM。一旦連接,它必須在退出之前分離,以避免資源泄漏。

This post有更多關於這種情況的信息,而this post有一些額外的細節。

+0

Doh!你是對的。其中一個較低級別的線程間接調用了「AttachCurrentThread」。非常感謝! –

相關問題