我使用JNI調用來使用本指南http://lol.zoy.org/blog/2011/3/2/load-pngs-using-android-ndk與Android類位圖加載PNG文件。
這工作完美無瑕,直到我嘗試從位圖獲取像素數據。我只是不能創建一個適合圖像數據(512 * 256)的jint數組,應用程序只是在這條線上崩潰。我做了一些測試,它只能在尺寸爲< = 85000(在我的HTC Desire上)的jint數組中無崩潰地工作。 我認爲這是一些內存不足的錯誤,但我沒有在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;
}
附:如果有人可以給出從Java代碼加載PNG的另一種方式(沒有pnglib和本地函數,如http://androgeek.info/?p=275)
這是不正確的。 JNI _does_「拋出」異常。他們不會改變控制流程,直到您返回到託管代碼,但他們在那裏。 env-> ExceptionCheck()將返回true,如果有掛起的託管異常。 – 2012-02-10 22:07:58
@ElliottHughes我明白你的意思。如果代碼自然到達JNI調用的結尾,並且觸發了異常/錯誤,您將看到它。但是,如果你有一個返回null的方法,例如你使用這個值,你的應用程序就會崩潰,你不會看到任何可能發生的錯誤。 (與在拋出錯誤時執行被中斷的Java不同) – 2012-02-11 14:02:32