このガイドhttp://lol.zoy.org/blog/2011/3/2/load-pngs-using-android-ndkを使用してAndroidクラスのビットマップでPNGファイルを読み込むためにJNI呼び出しを使用します。
ビットマップからピクセルデータを取得しようとするまで、これは完璧に動作します。私はちょうどこの行にクラッシュする画像データ(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;
}
P.S.誰かがJavaコードからpngをロードする代わりの方法を与えることができれば素晴らしいです(http://androgeek.info/?p=275のようなpnglibとネイティブ関数なし)
これは当てはまりません。 JNIは例外をスローします。管理コードに戻るまでコントロールの流れを変更することはありませんが、そこにはあります。 env-> ExceptionCheck()は、保留中の管理例外がある場合にtrueを返します。 –
@Elliottヒューズ私はあなたを指摘している。コードが自然にJNI呼び出しの終わりに達し、例外/エラーが発生した場合、それが表示されます。しかし、たとえばnullを返すメソッドがあり、この値を使用するとアプリケーションがクラッシュする場合、発生した可能性のあるエラーは表示されません。 (エラーがスローされた場合に実行が中断されるJavaとは異なり) –