2012-07-30 4 views
2

표시된 줄에 세그멘테이션 오류가 발생하는 것으로 보이는 다음 코드에 약간 문제가 있습니다. OpenCV Mat 개체를 인스턴스화하기 위해 8 비트 부호없는 정수 배열을 만들려고하지만 segfault는 배열을 채우는 루프를 통해 중간에 발생합니다.이 배열을 채우는 것이 왜 Segfault입니까?

매번 다른 반복에서 발생하는 것으로 보입니다. GC에 의해 무언가가 할당 해제 된 것으로 의심되지만, 어떤 것을 결정할 수는 없습니다.

SignDetector.c

JNIEXPORT void JNICALL Java_org_xxx_detectBlobs(JNIEnv *env, jclass clazz, jintArray in) 
{ 
    jint *contents = (*env)->GetIntArrayElements(env, in, NULL); 

    threshold(contents, PIXEL_SAMPLE_RATE); 
    detectBlobs(contents); 

    (*env)->ReleaseIntArrayElements(env, in, contents, 0); 
} 

BlobDetector.cpp

void detectBlobs(jint *contents) 
{ 
    LOGD("Call to detectBlobs in BlobDetector.cpp"); 

    uint8_t *thresholded = (uint8_t*) malloc(frame_size); 

    int i; 
    for(i = 0; i < frame_size - 1; i++) 
     thresholded[i] = (contents[i] == WHITE) ? 0 : 1; // Segfaults partway through this loop. 

frame_size 간단히 또한 jintArray의 길이에 상당하는 화상의 화소 수이라고 이미지가있는 기본 코드로 전달됩니다.

의견이 없습니다. NS?

+0

'frame_size'는'detectBlobs'가 호출 될 때 정확한 값을 보유하지 않습니다. 당시에는 초기화되지 않은 상태 일 수도 있습니다. 전역 변수를 사용하는 것의 장점은 주어진 시간에 누가 발에 총격을가하는지 모를 수 있다는 것입니다. –

+2

이것은 C++가 아닌 C89와 비슷합니다. – Puppy

+2

'GetIntArrayElements'의 배열의 크기가'frame_size'와 같은 크기입니까? '(* env) -> GetArrayLength (env, in);를 호출하고 크기를 확인하십시오. –

답변

0

Android 에뮬레이터에서 내 AVD를 다시 시작하면 문제를 해결할 수 있습니다. 문제는 실제 장치에서도 발생하지 않는 것으로 보이므로 가상 장치의 RAM에 무엇인가가 폭발했다는 결론 만 내릴 수 있습니다.

+0

18 시간 이내에 답변을 수락 할 수 있습니까? 어떻게 ... 좌절 했어. – jlm47

관련 문제