2012-02-07 119 views
1

我使用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

回答

1

異常不會在JNI中自動發生。你必須編寫代碼來觸發它們。即它在某處存儲錯誤,並且您必須添加代碼以說明您希望觸發異常的位置。

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


http://www.google.co.uk/search?q=java+png+library

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

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

我不知道哪個更好。

+0

這是不正確的。 JNI _does_「拋出」異常。他們不會改變控制流程,直到您返回到託管代碼,但他們在那裏。 env-> ExceptionCheck()將返回true,如果有掛起的託管異常。 – 2012-02-10 22:07:58

+0

@ElliottHughes我明白你的意思。如果代碼自然到達JNI調用的結尾,並且觸發了異常/錯誤,您將看到它。但是,如果你有一個返回null的方法,例如你使用這個值,你的應用程序就會崩潰,你不會看到任何可能發生的錯誤。 (與在拋出錯誤時執行被中斷的Java不同) – 2012-02-11 14:02:32

1

你需要向我們展示崩潰。 NewIntArray不應該崩潰;它應該返回NULL。 (如果NewIntArray失敗,env-> ExceptionCheck()也會返回true),但是崩潰應該告訴你問題是什麼,所以你需要顯示「adb logcat」輸出。