我有一个Java程序,用于以自定义文件格式显示图像,使用JNI通过C ++库读取。数据被加载到C ++端的char数组中,并传输到Java端的BufferedImage。由于图像的各个部分可以从内存中删除,需要定期重新加载,所以我希望这些操作尽可能快。
我目前正在这样做的方式是将数据从文件中读取到C ++库内存中的缓冲区中。为了填充BufferedImage,Java代码对每个像素进行JNI函数调用以从该缓冲区读取,并且如果需要,将另一块数据加载到缓冲区中。这有效,但开销比我想要的高。
我一直计划要做的就是使用JNI调用将BufferedImage对象传递给C ++代码,并从那一侧对其进行函数调用。我一直在研究JNI,但是我还没有发现从JVM加载的C ++库中修改Java对象是否有任何成本。这是实现这个的好方法,还是有更快的方法用JNI传输大量的字节数据?
答案 0 :(得分:2)
通过JNI边界移动数据的最有效方法可能是通过直接ByteBuffers.
你应该一次尽可能多地移动,因为它越过边界本身是低效的,而不是转移。当然不止一个像素,一次最好是兆字节。