【问题标题】:How to solve Android Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid xxxxx (Thread-X)?如何解决 Android Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid xxxxx (Thread-X)?
【发布时间】:2019-09-11 16:25:17
【问题描述】:

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

主要的 Opencv 特征逻辑在 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 将其与实时图像馈送进行比较。

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

【问题讨论】:

  • that image won't work again 是什么意思?
  • 我的意思是,如果我从参考图像中选择该图像,我会得到分段错误的错误
  • 您是否有机会尝试修改此图像?例如您错误地写入了这个只读图像
  • 不,我只是对它进行分段并将 3 个垫子的数组传递给下一个活动以进行实时处理。
  • 我意识到的另一个观察结果是,如果我处理超过 5 帧(这意味着 5 次)应用程序崩溃

标签: android android-ndk java-native-interface segmentation-fault opencv4android


【解决方案1】:

我解决了

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

  2. 如果您使用的是 Android Studio,请转到 file --> Invalidate Cache & Restart。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      经过一些讨论,问题很明显是与记忆的交互:

      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&amp; rgb, Mat&amp; gray); 必须更改为 double toGray(Mat rgb, Mat gray)

      可以在主题CvMat deep copy找到更多信息

      【讨论】:

      • 是的,它解决了新拍摄图像的问题,此外该过程变得更慢,但延迟是可以接受的。谢谢你的伙伴:)
      • @Amine 我似乎找不到那个源代码,请告诉我使用 openCVLibrary410 吗?谢谢
      【解决方案4】:

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

      1. 使 Android Studio 的缓存失效。

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

      【讨论】:

        【解决方案5】:

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

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

        无论如何,如果是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"

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 你也可以清除应用数据,对我来说效果很好..
          【解决方案7】:

          在我的例子中,当我开始在模拟器上使用它时,我正在使用带有 iPad 作为外部屏幕的 Macbook Pro(边车模式)。

          断开边车后。它工作正常。

          【讨论】:

            猜你喜欢
            • 2020-01-09
            • 2012-03-03
            • 2020-09-18
            • 2014-03-25
            • 2016-05-17
            • 2012-12-10
            • 1970-01-01
            • 2011-06-25
            • 2013-02-15
            相关资源
            最近更新 更多