gpt4 book ai didi

java - 使用更少的内存将 Bitmap 传递给 JNI

转载 作者:太空宇宙 更新时间:2023-11-04 13:45:51 28 4
gpt4 key购买 nike

在 Java 中,我让用户选择一个图像文件。然后我对其进行解码,转换为 PNG,然后传递给 JNI。我怀疑我不需要不断地复制和分配那么多内存。我怎样才能减少这个?有没有一种方法可以检测图像类型是 JPEG 还是 PNG 而不是解码和重新编码位图而只传递原始 JPEG/PNG 数据?或者用更少的分配进行转换?现在它正在消耗大量内存。

Java:

Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
yourSelectedImage.compress(Bitmap.CompressFormat.PNG, 100, outStream);
byte[] byteData = outStream.toByteArray();

JNILib.PickedImage(byteData);

在 C 中,我有以下用于 PickedImage 的代码:

jbyte *b = (jbyte*)env->GetByteArrayElements(data, NULL);
jsize dataSize = env->GetArrayLength(data);
byte* imageData = (byte*)malloc(dataSize);
memcpy(imageData, b, dataSize);
env->ReleaseByteArrayElements(data, b, 0);

imageSelectCallback(imageData, dataSize);

最佳答案

使用 java.nio.ByteBuffer 并调用 allocateDirect 函数来分配 Java 和 C 均可访问的内存。然后在 C 中,获取指向缓​​冲区的指针执行:env->GetDirectBufferAddress 并通过执行 env->GetDirectBufferCapacity 调整它的大小。

这样一来,同一枚硬币的两面只共享一个缓冲区。 Java 和 C 将在同一个图像上运行。

再次,将文件读入 java.nio.ByteBuffer 并将其传递给 C。如果 C 需要图像的 COPY,那么您别无选择,只能分配 2 个缓冲区(就像你现在做的那样)..我怀疑你不需要一个拷贝,你可以修改 Java 给你的缓冲区..

关于java - 使用更少的内存将 Bitmap 传递给 JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26025303/

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