2012-02-07 3 views
1

이 가이드 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를로드하는 대체 방법을 제공 할 수 있다면 정말 멋지게 될 것입니다.

답변

1

JNI에서는 예외가 자동으로 발생하지 않습니다. 트리거하려면 코드를 작성해야합니다. 즉 어딘가에서 오류를 저장하고 예외를 트리거 할 위치를 말하도록 코드를 추가해야합니다.

http://java.sun.com/docs/books/jni/html/exceptions.html


http://code.google.com/p/javapng/

http://code.google.com/p/pngj/

http://www.google.co.uk/search?q=java+png+library에서 나는 더 알고하지 않습니다.

+0

이 사실이 아닙니다. JNI는 예외를 "throw"합니다. 관리 코드로 돌아갈 때까지 컨트롤의 흐름을 변경하지는 않지만 거기에 있습니다. env-> ExceptionCheck()는 보류중인 관리 예외가있는 경우 true를 반환합니다. –

+0

@ 엘리엇 휴즈 나는 당신이 지적하는 것을 본다. 코드가 자연스럽게 JNI 호출의 끝에 도달하고 예외/오류가 발생하면이를 볼 수 있습니다. 그러나 예를 들어 null을 반환하는 메서드가 있고이 값을 사용하면 응용 프로그램이 중단되므로 발생했을 수있는 오류는 표시되지 않습니다. (오류가 발생하면 실행이 중단되는 Java와 달리) –

1

우리에게 충돌을 표시해야합니다. NewIntArray가 충돌하지 않아야합니다. NULL을 리턴해야합니다. (env-> ExceptionCheck() 또한 NewIntArray가 실패하면 true를 반환합니다.)하지만 문제가 무엇인지 알려주면 충돌이 발생하므로 "adb logcat"출력을 표시해야합니다.

관련 문제