2012-02-07 30 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”输出。