gpt4 book ai didi

android - 来自 Android 的 OpenCV JNI 上的 SIGSEGV

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:06 25 4
gpt4 key购买 nike

我正在尝试通过 OpenCV Java 运行一段代码,然后将 Mat 对象传递给 OpenCV JNI 代码,该代码对其进行 Canny Edge 检测并返回 Mat。但不知何故,我在应用程序启动时反复收到 SIGSEGV,我不确定这是为什么:

09-23 00:30:19.501 20399-20547/com.example.opencv.opencvtest A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x3 in tid 20547 (Thread-7450)

有问题的 Java 代码段是:

@Override
public void onCameraViewStarted(int width, int height) {
// Everything initialized
mGray = new Mat(height, width, CvType.CV_8UC4);
mGauss = new Mat(height, width, CvType.CV_8UC4);
mCanny = new Mat(height, width, CvType.CV_8UC4);
}

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mGray = inputFrame.rgba();
Imgproc.GaussianBlur(mGray, mGauss, new Size(), 5);

// This works perfectly fine
// Imgproc.Canny(mGauss, mCanny, 0, 20);

// But this causes a SIGSEGV
nativeCanny(mGauss.getNativeObjAddr(), mCanny.getNativeObjAddr());
return mCanny;
}

JNI代码是:

 extern "C" {
JNIEXPORT jboolean JNICALL
Java_com_example_opencv_opencvtest_MainActivity_nativeCanny(JNIEnv *env, jobject instance, long iAddr, long oAddr) {

cv::Mat* blur = (cv::Mat*) iAddr;
cv::Mat* canny = (cv::Mat*) oAddr;

// This line is causing the SIGSEGV because if I comment it,
// everything works (but Mat* canny is empty so shows up black screen)
Canny(*blur, *canny, 10, 30, 3 );

return true;
}
}

知道为什么会这样吗?我花了大半天的时间试图弄清楚为什么这会中断,但除了隔离有问题的语句外没有取得任何进展。

编辑:来自评论

我认为是 mCanny 的初始化错误。如果我将 JNI 调用更改为 Canny(*blur, *blur, 10, 30, 3 );然后在 Java 中返回 mGauss 而不是 mCanny 然后它工作正常。这暂时修复了它,但老实说,我仍然不确定为什么 mCanny 会导致 SIGSEGV。

最佳答案

SEGV 表示您尝试读/写未分配的内存。故障地址是 3。接近 0 的东西几乎总是意味着您取消引用了一个空指针。我的猜测是 mGauss 或 mCanny 的 native 对象地址为 0。

关于android - 来自 Android 的 OpenCV JNI 上的 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39647309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com