안드로이드 개발 질문/답변
(글 수 45,052)
안드로이드에서 영상처리를 해야해서..
JNI 이용해서 Native code에서 영상처리 후, Java code에서 처리한 영상을 뿌려주려고 합니다.
그래서 (Java)
mBitmap.getPixels(colors, 0, mWidth, 0, 0, mWidth, mHeight);
함수를 이용해서 colors 배열에 픽셀값을 받았구요,
(C code)
jint *rawImage; // 전역변수
jint Java_android_app_ImageProc_InterfaceJNI_Init
(JNIEnv *env, jobject thiz, jintArray data, jint height, jint width)
{
rawImage = (*env)->GetIntArrayElements(env, data, 0);
}
이런식으로 java에서 만든 배열을 받아왔구요.
다른 코드에서 ReleaseIntArrayElements() 를 호출하긴 했는데, 세 번째 인자로 JNI_COMMIT 를 주었으니까
rawImage 포인터가 가리키던 메모리가 해제되진 않았을 거라고 생각했어요.
그리고나서
jboolean Java_android_app_ImageProc_InterfaceJNI_MakeLabelTable
(JNIEnv *env, jobject thiz, jintArray data)
함수에서 몇 가지 처리를 하고 다시 (*env)->ReleaseIntArrayElements(env, dest, source, JNI_COMMIT);
이렇게 호출해서.. Java code 상에 colors 배열을 수정하려고 한 것인데요..
제대로 값이 들어갔는지 확인하려고 Java code에서 아무리 colors 배열을 찍어봐도
생각한대로 안나오네요;;
1. native code debugging이 여러모로 복잡하다는 식의 글들이 많던데요..
Log cat 찍어서 하는 방법말고 더 간단한 방법은 없을까요? ; 그것도 liblog.so 써야해서 좀 복잡한것 같길래요;
2. 맨 위에 Java code에서, getPixels() 함수 쓰면, 한 pixel 정보가 alpha. red. gree. blue 각 1byte 씩 한 개의 integer에 들어가는거
맞죠?? ;; 혹시 다른 식으로 들어간다거나, 순서가 역순이라거나 하는건 아니죠? ;;
우.. 시간도 촉박한데 잘 안되니까 죽겠네요 ㅠㅠ..
검색해보면 많이 나오지만 매크로로 만들어서 쓰는게 잴 편하구요...
만약 이클립스에 연동하고 브렉포인트잡고 이런걸 원하시면 연동은 제껴두고 gdb만쓰세요 그게 정신건강에 좋습니다.
2. 순서가 역순으로 나올 가능성도 있습니다. 왜그런지는 모르겠는데 저같은경우 ffmpeg로 영상데이터 변환할때
YUV420->Bitmap 과정 이후에 위로 올렸을때 역순으로 나오는 경우가 있었습니다.
그게 IntegerBuffer인가 그거 쓰냐 마냐에 따라서 좀 달랐던걸로 기억이 나는데요.... 가물가물 하네요.