이 가이드 http://lol.zoy.org/blog/2011/3/2/load-pngs-using-android-ndk을 사용하여 Android 클래스 Bitmap으로 PNG 파일을로드하기 위해 JNI 호출을 사용합니다.
그리고 비트 맵에서 픽셀 데이터를 얻으려고 할 때까지 완벽하게 작동합니다. 난 그냥 이미지 데이터 (512 * 256), 애플 리케이션이 라인에 충돌에 맞는 것입니다 jint 배열을 만들 수 없습니다. 나는 약간의 테스트를하고 크래쉬없이 jint 배열 인 < = 85000 (HTC Desire에서)과 함께 작동한다. 나는 그것이 메모리 오류 중 일부라고 생각하지만 logcat에서 아무런 관련 오류도 발생하지 않으며 jint 배열을 만들려고 할 때 다른 오류가 발생하지 않도록 시도합니다.JNI NewIntArray()에서 큰 배열을 만들 수 없습니다.
#include <jni.h>
int load_image_png(const char* path, GLuint* width, GLuint* height, void** image_data){
//Skip part what works fine - get bitmap width and height
//width=512, height=256
jintArray array = g_env->NewIntArray(width*height);//FAIL OVERHERE
jint* pixels = g_env->GetIntArrayElements(array, 0);
*image_data = pixels;
//closing a bitmap work fine too
return 0;
}
P.S. 누군가가 Java 코드에서 pnglib 및 기본 함수 (http://androgeek.info/?p=275 등)없이 png를로드하는 대체 방법을 제공 할 수 있다면 정말 멋지게 될 것입니다.
이 사실이 아닙니다. JNI는 예외를 "throw"합니다. 관리 코드로 돌아갈 때까지 컨트롤의 흐름을 변경하지는 않지만 거기에 있습니다. env-> ExceptionCheck()는 보류중인 관리 예외가있는 경우 true를 반환합니다. –
@ 엘리엇 휴즈 나는 당신이 지적하는 것을 본다. 코드가 자연스럽게 JNI 호출의 끝에 도달하고 예외/오류가 발생하면이를 볼 수 있습니다. 그러나 예를 들어 null을 반환하는 메서드가 있고이 값을 사용하면 응용 프로그램이 중단되므로 발생했을 수있는 오류는 표시되지 않습니다. (오류가 발생하면 실행이 중단되는 Java와 달리) –