Я пытаюсь запустить кусок кода через OpenCV Java, а затем передать объект Mat в код JNI OpenCV, который обнаруживает на нем Canny Edge и возвращает Mat. Но так или иначе, я неоднократно получаю SIGSEGV, когда приложение запускает и я не уверен, почему это:SIGSEGV на OpenCV JNI от Android
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;
}
}
Любая идея, почему это происходит? Я потратил лучшую половину дня, пытаясь понять, почему это ломается, но не продвинулся вперед, кроме как изолировать проблематичные заявления.
EDIT: От комментариев
Я думаю, что это была ошибка с инициализацией mCanny. Если я изменю вызов JNI на Canny (* blur, * blur, 10, 30, 3); а затем в Java вернет mGauss вместо mCanny, тогда он отлично работает. Это исправляет это на данный момент, но я, честно говоря, все еще не уверен, почему mCanny вызывает SIGSEGV.
Должна быть трассировка стека, напечатанная логически, после сообщения об ошибке sigsegv. Попробуйте изменить фильтр на logcat на «Нет фильтров» и сообщите нам, если вы увидите трассировку стека на выходе. –
След: 09-23 01: 45: 32.911 442-442 /? I/DEBUG: backtrace: 09-23 01: 45: 32.911 442-442 /? I/DEBUG: # 00 pc 00008230 /data/app/com.example.opencv.opencvtest-2/lib/arm/libgauss.so (Java_navin_tuts_opencv_opencvtest_MainActivity_nativeCanny + 39) 09-23 01: 45: 32.911 442-442 /? I/DEBUG: # 01 pc 0001082b /data/data/com.example.opencv.opencvtest/cache/slice-slice_4-classes.dex 39-я строка - это размытие = (cv :: Mat *) iAddr; строка, показанная выше – navinpai