Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从jni(ndk)创建大型阵列并将其返回到android_Android_Android Ndk_Java Native Interface - Fatal编程技术网

从jni(ndk)创建大型阵列并将其返回到android

从jni(ndk)创建大型阵列并将其返回到android,android,android-ndk,java-native-interface,Android,Android Ndk,Java Native Interface,我正在开发一个应用程序,其中我需要读取大型图像文件(6000x6000),然后应用一些过滤(如模糊和颜色效果),然后保存图像。 过滤库是一个用Java编程的第三方库,输入如下内容: /** * rgbArray : is an Array of pixels */ public int[] ImageFiltering(int[] rgbArray,int Width,int Height); 问题是,如果我在内存中加载图像(6000 x 6000 x 4=137.33 MB),androi

我正在开发一个应用程序,其中我需要读取大型图像文件(6000x6000),然后应用一些过滤(如模糊和颜色效果),然后保存图像。 过滤库是一个用Java编程的第三方库,输入如下内容:

/**
* 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中实现它。

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


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

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


    您需要提供一个补充方法来处理内存或向本机表明它不再使用。

    谢谢,我将检查ByteBuffer,进行测试并告诉您结果。谢谢,我将检查ByteBuffer,进行测试并告诉您结果。