我有一些从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.
答案 0 :(得分:1)
事实证明SIGABRT
过载了。它发生在对未响应的应用程序,对abort()
的调用以及未处理的异常的响应中。 logcat输出并没有告诉你哪一个发生了。
我通过dup'ing stderr发现了这一点 - 解压后的数据与应用中的算法不匹配,因此只要调用慢速算法就会发生异常。