如何解决 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"
我通过
解决了
重新启动了我的智能手机(物理设备)。
如果您使用的是 Android Studio,请转至 文件 --> 使缓存无效并重新启动。
我确实遇到了这个问题,但经过验证的答案没有帮助。相反,该线程中其他答案的组合确实如此。
简而言之,我所做的就是:
正在使 Android Studio 的缓存失效。
擦除设备的数据并冷启动它。
对我来说解决此问题的最简单方法是卸载并重新安装该应用程序。
我正在使用 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"
我通过
解决了重新启动了我的智能手机(物理设备)。
如果您使用的是 Android Studio,请转至 文件 --> 使缓存无效并重新启动。
我确实遇到了这个问题,但经过验证的答案没有帮助。相反,该线程中其他答案的组合确实如此。 简而言之,我所做的就是:
正在使 Android Studio 的缓存失效。
擦除设备的数据并冷启动它。
对我来说解决此问题的最简单方法是卸载并重新安装该应用程序。