표시된 줄에 세그멘테이션 오류가 발생하는 것으로 보이는 다음 코드에 약간 문제가 있습니다. 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?
'frame_size'는'detectBlobs'가 호출 될 때 정확한 값을 보유하지 않습니다. 당시에는 초기화되지 않은 상태 일 수도 있습니다. 전역 변수를 사용하는 것의 장점은 주어진 시간에 누가 발에 총격을가하는지 모를 수 있다는 것입니다. –
이것은 C++가 아닌 C89와 비슷합니다. – Puppy
'GetIntArrayElements'의 배열의 크기가'frame_size'와 같은 크기입니까? '(* env) -> GetArrayLength (env, in);를 호출하고 크기를 확인하십시오. –