我使用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)
这是不正确的。 JNI _does_“抛出”异常。他们不会改变控制流程,直到您返回到托管代码,但他们在那里。 env-> ExceptionCheck()将返回true,如果有挂起的托管异常。 – 2012-02-10 22:07:58
@ElliottHughes我明白你的意思。如果代码自然到达JNI调用的结尾,并且触发了异常/错误,您将看到它。但是,如果你有一个返回null的方法,例如你使用这个值,你的应用程序就会崩溃,你不会看到任何可能发生的错误。 (与在抛出错误时执行被中断的Java不同) – 2012-02-11 14:02:32