为什么我的Android应用程序在线程退出时崩溃?

4

为什么我的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线程实例(std::thread)的C++库。下面是我在库中处理线程的示例:

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

这个库在 iOS、OS X 和 Linux 上都没有出现这样的错误。我猜测这个错误不是因为缺少对 std::thread::detach 的调用。

不确定以下信息是否相关:

  • 我使用 gnustl_static
  • 该库通过 NDK 集成,但底层代码是平台无关的,因此我没有调用 JavaVM::AttachCurrentThreadJavaVM::DetachCurrentThread

我不确定该怎么做或者该寻找什么。


1
查看此链接 https://dev59.com/lV8d5IYBdhLWcg3wtz8Q 。您的logcat与源代码中线程退出前未分离的错误消息相匹配。如果这不是有用的,请抱歉。 - Richard Critten
1个回答

4

嗯,某些东西正在调用AttachCurrentThread函数。如果没有任何东西在调用该函数,虚拟机将无法确定线程是否已退出。

任何调用JNI的线程都必须先附加到虚拟机上。一旦附加,必须在退出之前解除附加以避免资源泄漏。

这篇文章提供了有关此情况的更多信息,而这篇文章则提供了一些额外的细节。


糟糕!你是对的。其中一个较低级别的线程间接调用了AttachCurrentThread。非常感谢! - Jan Deinhard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接