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

Ami*_*ine 9 java-native-interface android segmentation-fault android-ndk opencv4android

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

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

<activity
   android:hardwareAccelerated="false" />
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助将不胜感激,并提前感谢您。

编辑

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

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

Adi*_*wal 8

我解决了

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

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


sne*_*yan 7

如果您使用的是 Android 模拟器,请尝试[冷启动]


use*_*837 4

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

其他信息可以在主题中找到CvMat deep copy