JNI NewIntArray()无法创建大数组

时间:2012-02-07 10:00:20

标签: java c++ c android-ndk java-native-interface

我使用JNI调用使用本指南http://lol.zoy.org/blog/2011/3/2/load-pngs-using-android-ndk加载带有Android类位图的PNG文件。
这样可以完美运行,直到我尝试从Bitmap获取像素数据。我只是无法创建一个适合图像数据(512 * 256)的jint数组,应用程序只是崩溃在这一行。我做了一些测试,只有jint数组的大小< = 85000(在我的HTC Desire上)才能正常工作。 我认为这是一些内存不足错误,但我在logcat中没有相关的错误,我试图只创建一个jint数组,没有任何其他代码也崩溃。

#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的替代方法(没有pnglib和http://androgeek.info/?p=275中的本机函数),这将是非常棒的

2 个答案:

答案 0 :(得分: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/

我不知道哪个更好。

答案 1 :(得分:1)

你需要向我们展示崩溃。 NewIntArray不应该崩溃;它应该返回NULL。 (env-&gt; ExceptionCheck()如果NewIntArray失败也会返回true。)但是崩溃应该告诉你问题是什么,所以你需要显示“adb logcat”输出。