2012-02-07 33 views
1

このガイド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とネイティブ関数なし)

答えて

1

例外はJNIでは自動的には発生しません。それらを起動するコードを記述する必要があります。つまり、エラーをどこかに格納し、例外をトリガーする場所を指定するコードを追加する必要があります。 http://www.google.co.uk/search?q=java+png+library

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

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

から

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


私が優れているか分かりません。

+0

これは当てはまりません。 JNIは例外をスローします。管理コードに戻るまでコントロールの流れを変更することはありませんが、そこにはあります。 env-> ExceptionCheck()は、保留中の管理例外がある場合にtrueを返します。 –

+0

@Elliottヒューズ私はあなたを指摘している。コードが自然にJNI呼び出しの終わりに達し、例外/エラーが発生した場合、それが表示されます。しかし、たとえばnullを返すメソッドがあり、この値を使用するとアプリケーションがクラッシュする場合、発生した可能性のあるエラーは表示されません。 (エラーがスローされた場合に実行が中断されるJavaとは異なり) –

1

クラッシュを表示する必要があります。 NewIntArrayはクラッシュしません。 NULLを返します。 (env-> ExceptionCheck()は、NewIntArrayが失敗した場合にもtrueを返します)、クラッシュすると問題の原因がわかるので、 "adb logcat"出力を表示する必要があります。

関連する問題