java - 高效地将大量字节数据从C++传输到Java

标签 java image java-native-interface

我有一个 Java 程序,旨在以自定义文件格式显示图像,使用 JNI 读取 C++ 库。 .数据被加载到 C++ 端的 char 数组中,并传输到 Java 端的 BufferedImage。由于图像的某些部分可能会从内存中删除并且需要相当定期地重新加载,所以我希望这些操作尽可能快。

我目前这样做的方式是将数据从文件中读取到 C++ 库内存中的缓冲区中。为了填充 BufferedImage,Java 代码为每个像素调用 JNI 函数以从此缓冲区读取数据,并在必要时将另一 block 数据加载到缓冲区中。这可行,但开销比我想要的要高。

为了改进这一点,我计划做的是使用 JNI 调用将 BufferedImage 对象传递给 C++ 代码,并从那一侧对其进行函数调用。我一直在尽我所能地研究 JNI,但我无法确定从 JVM 加载的 C++ 库修改 Java 对象是否有任何成本。这是实现它的好方法,还是有更快的方法来使用 JNI 传输大量字节数据?

最佳答案

跨 JNI 边界移动数据的最有效方法可能是通过直接 ByteBuffers。 您应该一次移动尽可能多的数据,因为它本身就是跨边界的,效率很低,不是转移。当然不止一个像素,一次最好是兆字节。

关于java - 高效地将大量字节数据从C++传输到Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17180484/

相关文章:

java - 在 Java 中从内存中执行一个可执行程序(.exe)

java - 如何在编译时验证注释?

java - 获取知道包名称的应用程序名称

java - 将图像放在 JButton 上方(而不是内部)并使 JButton 仍然工作

html - CSS 可调整大小的带标题的图像

java - 加密 JNI 在压力测试期间崩溃

java-native-interface - Kotlin/Native 自己能用吗?

java - 打印集合

java - 尝试从文件读取数据(文件每两行包含换行符)

c# - 确定图像文件的格式?