我正在开发一个应用程序,我需要读取大图像文件(6000x6000),然后应用一些过滤(如模糊和颜色效果),然后保存图像。过滤库是用 Java 编写的第 3 方库,并采用以下内容作为输入:
/**
* rgbArray : is an Array of pixels
*/
public int[] ImageFiltering(int[] rgbArray,int Width,int Height);
问题是,如果我将图像加载到内存中(6000 x 6000 x 4 = 137.33 MB),android 会抛出 OutOfMemory 错误。在阅读了一些文档并知道从 NDK 分配的内存不是应用程序堆的一部分后,我有了一个有趣的想法:
从 NDK 打开图像 读取它的内容并保存在一个数组中
将数组传回 Java
对数组数据应用过滤器
将数组返回到 NDK
将数据数组保存到新图像中并释放数组内存
这是一个返回大数组的 NDK 函数示例:
jint*
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,jobject thiz,jint w,jint h)
{
int* pixels = (int*)malloc(w * h * 4);
read_image_into_array("image.jpg",pixels);
return pixels;
}
目标是在本机中保留内存以避免出现 OutOfMemory 错误,并将内存引用传递给 Java 以便使用它。由于我不是 C 开发人员,也从未接触过 JNI,所以这一切有意义吗?如何在 NDK 中实现它。