마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

ndk 특정함수 호출 시 에러 발생..

0 추천

 

ndk 경험은 많지 않습니다.

 

yuv to rgb convert 작업을 하기 위해 관련 함수를 제작하여 Load하려는데

아래와 같이 에러가 발생됩니다.

JNI를 호출하지 못하는가 싶었지만, JNI에서 생성하는 TEXT를 정상적으로 출력합니다.

convert 함수의 문제인가 싶어 다른 예제를 돌려보았지만 마찬가지입니다.

"Hello from JNI" 는 jni 함수를 호출한 경우입니다.

convert 함수를 호출하면 아래와 같이 죽는데, native로 던지는 값이 null도 아니고 정상적으로 들어갑니다.

어떤 문제일까요..

 

12-28 00:36:34.389: D/dalvikvm(17427): Trying to load lib /data/app-lib/패키지명-72/libyuv2rgb_convert.so 0x42aa6600
12-28 00:36:34.389: D/dalvikvm(17427): Added shared lib /data/app-lib/패키지명-72/libyuv2rgb_convert.so 0x42aa6600
12-28 00:36:34.389: D/dalvikvm(17427): No JNI_OnLoad found in /data/app-lib/패키지명-72/libyuv2rgb_convert.so 0x42aa6600, skipping init
12-28 00:36:34.389: I/클래스명(17427): 변환중.. 1/4
12-28 00:36:34.394: I/클래스명(17427): Hello from JNI !
12-28 00:36:34.394: A/libc(17427): Fatal signal 11 (SIGSEGV) at 0x1dd00009 (code=1), thread 17960 (Thread-10097)

 

jni c 파일

#include <jni.h>

int* rgbData;
int rgbDataSize = 0;

JNIEXPORT void JNICALL Java_패키지명_yuv2rgb(JNIEnv * env, jobject obj, jintArray rgb, jbyteArray yuv420sp, jint width, jint height)
{
    int             sz;
    int             i;
    int             j;
    int             Y;
    int             Cr = 0;
    int             Cb = 0;
    int             pixPtr = 0;
    int             jDiv2 = 0;
    int             R = 0;
    int             G = 0;
    int             B = 0;
    int             cOff;
    int w = width;
    int h = height;
    sz = w * h;

    jbyte* yuv = yuv420sp;
    if(rgbDataSize < sz) {
        int tmp[sz];
        rgbData = &tmp[0];
        rgbDataSize = sz;
    }

    for(j = 0; j < h; j++) {
             pixPtr = j * w;
             jDiv2 = j >> 1;
             for(i = 0; i < w; i++) {
                     Y = yuv[pixPtr];
                     if(Y < 0) Y += 255;
                     if((i & 0x1) != 1) {
                             cOff = sz + jDiv2 * w + (i >> 1) * 2;
                             Cb = yuv[cOff];
                             if(Cb < 0) Cb += 127; else Cb -= 128;
                             Cr = yuv[cOff + 1];
                             if(Cr < 0) Cr += 127; else Cr -= 128;
                     }
                     R = Y + Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5);
                     if(R < 0) R = 0; else if(R > 255) R = 255;
                     G = Y - (Cb >> 2) + (Cb >> 4) + (Cb >> 5) - (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5);
                     if(G < 0) G = 0; else if(G > 255) G = 255;
                     B = Y + Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6);
                     if(B < 0) B = 0; else if(B > 255) B = 255;
                     rgbData[pixPtr++] = 0xff000000 + (B << 16) + (G << 8) + R;
             }
    }
    (*env)->SetIntArrayRegion(env, rgb, 0, sz, ( jint * ) &rgbData[0] );
}

 

 

개발자초심 (21,220 포인트) 님이 2015년 12월 28일 질문
개발자초심님이 2015년 12월 29일 수정

1개의 답변

0 추천
어떻게 호출하는지 코드를 보여 주셔야 할 듯 한데요...  

아님 12-28 00:36:34.394: A/libc(17427): Fatal signal 11 (SIGSEGV) at 0x1dd00009 (code=1), thread 17960 (Thread-10097) 아래 찍히는 로그(stack trace) 라도 주셔야. 어느 위치에서 죽는지 확인이 가능할 듯 합니다.

 

NULL 이 아니라면 메모리를 깨먹었을 가능성도 있습니다.
익명사용자 님이 2015년 12월 28일 답변
답변 감사합니다.

Fatal signal 아래 에러로그는 더이상 없습니다..
jni 생성하는 c 소스 첨부하였습니다.
...