gpt4 book ai didi

android - 从 jni (ndk) 创建大数组并将它们返回给 android

转载 作者:行者123 更新时间:2023-11-30 03:56:52 26 4
gpt4 key购买 nike

我正在开发一个应用程序,我需要读取大图像文件 (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 错误。看了一些documentation并且知道从 NDK 分配的内存不是应用程序堆的一部分,我得到一个有趣的想法:

  1. 从NDK中打开图片读取内容并保存到数组中

  2. 将数组传回Java

  3. 对数组数据应用过滤器

  4. 返回数组给NDK

  5. 将数据数组保存到新的图像中,并释放数组内存

这里是一个返回大数组的 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;
}

目标是在 native 中保留内存以避免出现 OutOfMemory 错误,并将内存引用传递给 Java 以便使用它。由于我不是 C 开发人员并且从未接触过 JNI,所以这一切是否有意义以及如何在 NDK 中实现它。

最佳答案

使用直接的 ByteBuffer,使用分配的内存作为其后备缓冲区。您可以从 JNI 分配一个直接字节缓冲区(使用 NewDirectByteBuffer())并返回它。

您需要提供一种补充方法来处理内存或以其他方式向 native 端指示它不再使用。

关于android - 从 jni (ndk) 创建大数组并将它们返回给 android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13209107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com