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] );
}