我正在做一个OpenGL项目,它要求我通过JNI库实现JVM,以使用JavaGraphics2D在c ++中渲染到OpenGL映射缓冲区。我知道我可以使用指向映射缓冲区的void*
指针创建一个java.nio.ByteBuffer
对象:
jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity);
如果我通过将其转换为byte[]
数组,将该数组包装在ByteArrayInputStream
并使用ImageIO.read()
来传递此ByteBuffer
,最终BufferedImage
仍然使用与void*
指针相同的内存进行存储,还是 ImageIO 方法是否为 BufferedImage 存储分配新内存? 即如果我使用 Java2DGraphics 绘制到缓冲图像上, 它会导致原始的void*内存也被更改吗?
如果不是这种情况,我将不得不将BufferedImage数据复制到ByteBuffer中
ImageIO.read 处理各种输入源并分配自己的内存,它不会与它返回的 BufferedImage 共享您的原始字节 []。
因此,您需要调用ImageIO.write来取回修改。