【问题标题】:create big arrays from jni (ndk) and return them to android从 jni (ndk) 创建大数组并将它们返回给 android
【发布时间】:2012-11-03 12:18:30
【问题描述】:

我正在开发一个应用程序,我需要读取大图像文件 (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;
}

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

【问题讨论】:

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


    【解决方案1】:

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

    您需要提供一种补充方法来处理内存或以其他方式向本机端表明它已不再使用。

    【讨论】:

    • 谢谢,我会检查ByteBuffer,做个测试告诉你结果。
    猜你喜欢
    • 2011-09-02
    • 2013-06-12
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2015-04-24
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多