如何解决 Android Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid xxxxx (Thread-X)?

How to solve Android Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid xxxxx (Thread-X)?

我正在使用 Opencv sdk Android 来开发实时处理和匹配。

主要的 Opencv traitment 逻辑在 JNI 函数中。

问题是有时(只是有时)我的应用程序没有错误地崩溃,所以我忽略了这个问题,直到我完成算法开发。

我开始调查错误,它肯定在 JNI 部分。

这是我在 Log

中得到的错误
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 27424 (Thread-8)
A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0

我在网上搜索了很多,找到了这个解决方案

<activity
   android:hardwareAccelerated="false" />

它工作了 2 天,现在我又遇到了同样的错误。

有什么问题,我该如何解决?

如有任何帮助,我们将不胜感激,并提前致谢。

编辑

我应该补充一点,我的应用程序从图库中获取参考图像,并使用 Opencv 将其与实时图像馈送进行比较。

如果我从图库中选择一张图片并且应用程序崩溃,则该图片将无法再次使用,如果我拍摄一张新图片或之前可以使用的图片,该应用程序可以正常工作。

经过一番讨论后,很明显问题出在与内存的交互上:

extern "C" 
jdouble 
JNICALL Java_com_foo(JNIEnv *env, jclass type, jlong addrRgba, jlong addrGray) { 
  Mat &mRgb = *(Mat *) addrRgba;
  Mat &mGray = *(Mat *) addrGray;

  return (jdouble) toGray(mRgb, mGray);
}

作为快速修复,必须将 double toGray(Mat& rgb, Mat& gray); 更改为 double toGray(Mat rgb, Mat gray)

有关主题 CvMat deep copy

的更多信息

如果你在 android 模拟器上尝试[冷启动]它

就我而言,当我开始在模拟器上安装它时,我使用的是带有 iPad 作为外部屏幕(sidecar 模式)的 Macbook Pro。

断开 Sidecar 后。它工作正常。

就我而言,我将问题缩小到在片段中加载 Admob 广告。但仅当屏幕第二次呈现时。

示例:我离开屏幕,然后通过 FragmentManager return 回到屏幕。

无论如何,如果是 adview,您可以通过在 AndroidManifest.xml 中关闭硬件加速来修复,甚至更好,直接在广告组件本身上:

val adRequest: AdRequest = AdRequest.Builder().build()
    // disable hardware acceleration on this view, as it was causing the screen to crash on reload.
    adView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
    adView.loadAd(adRequest)

将范围缩小到这个有点棘手,但我注意到了这一点:

I/DynamiteModule: 考虑本地模块 com.google.android.gms.ads.dynamite:0 和远程模块 com.google.android.gms.ads.dynamite:204204100

消息正上方

" 致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 19705 (RenderThread) 中的故障地址 0x0,pid 19631"

我通过

解决了
  1. 重新启动了我的智能手机(物理设备)。

  2. 如果您使用的是 Android Studio,请转至 文件 --> 使缓存无效并重新启动。

我确实遇到了这个问题,但经过验证的答案没有帮助。相反,该线程中其他答案的组合确实如此。 简而言之,我所做的就是:

  1. 正在使 Android Studio 的缓存失效。

  2. 擦除设备的数据并冷启动它。

对我来说解决此问题的最简单方法是卸载并重新安装该应用程序。