5

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

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

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

4

1 回答 1

2

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

于 2013-06-19T00:21:51.577 回答