在NDK创建的后台线程中的SIGABRT

时间:2015-06-15 13:41:59

标签: android c++ multithreading android-ndk

我有一些从Xamarin调用的Android NDK代码。直接返回的简单东西是可以的,但是当我创建一个后台线程时,我得到一个std::thread(lambda)并且应用程序死了。

后台线程是使用@using(Ajax.BeginForm("RefineSearchResults", "Search", new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "resultsSec" })) { <input type="submit" value="submit" /> <div id="resultsSec"></div> } 创建的。需要后台NDK线程,因为此代码必须解压缩非常大的数据文件,然后使用解压缩的数据运行一些CPU密集型算法。

现在,SIGABRT似乎来自libc,据称这是应用程序无响应的症状。然而,这应该只影响主线程?在开发人员选项中,我确实启用了“显示所有ANR”选项,但只会在Android软件的周围闪烁一些红框。

为什么Android会混淆我的后台线程和前台线程?如何告诉Android不要杀死我的后台线程?

Android v5.1.1库存Google / LG Nexus 5.

1 个答案:

答案 0 :(得分:1)

事实证明SIGABRT过载了。它发生在对未响应的应用程序,对abort()的调用以及未处理的异常的响应中。 logcat输出并没有告诉你哪一个发生了。

我通过dup'ing stderr发现了这一点 - 解压后的数据与应用中的算法不匹配,因此只要调用慢速算法就会发生异常。