2016-09-22 1 views
2

Я пытаюсь запустить кусок кода через 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.

+0

Должна быть трассировка стека, напечатанная логически, после сообщения об ошибке sigsegv. Попробуйте изменить фильтр на logcat на «Нет фильтров» и сообщите нам, если вы увидите трассировку стека на выходе. –

+0

След: 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

ответ

1

SEGV означает, что вы пытались прочитать/записать нераспределенную память. Адрес ошибки - 3. То, что близко к 0, почти всегда означает, что вы разыменовали нулевой указатель. Я предполагаю, что либо mGauss, либо mCanny имели 0 для своего родного объекта addr.

+0

Проверяемые значения с помощью отладчика, и они показывают -1420884552 и -1420884432. Это означает, что они получают значения мусора? – navinpai

+0

Ни один из них не кажется плохим - его возможно, что его что-то дальше в ваш код C. Тем не менее, факт, что нуль получил разыменование в C, –

+1

Я думаю, что это была ошибка с инициализацией mCanny. Если я изменю вызов JNI на Canny (* blur, * blur, 10, 30, 3); а затем в Java вернет mGauss вместо mCanny, тогда он отлично работает. Это исправляет это на данный момент, но я, честно говоря, все еще не уверен, почему mCanny вызывает SIGSEGV! – navinpai

 Смежные вопросы

  • Нет связанных вопросов^_^