我想将字节数组的内存位置传递给jni调用,以便不必复制该数组。有一个问题here暗示着sun.misc.Unsafe可以实现。有一个如何做到这一点的例子吗?
用例是我有一个BufferedImage,并且我有一个采用指针的OpenGL方法。我知道显而易见的事情是分配一个直接的字节缓冲区,但我想保存在副本上。
答案 0 :(得分:0)
首先,如果完全可行,请迁移到JNA,这对用户更加友好(不需要您编译c文件)
如果要直接将数据传递给本机代码,请不要使用数组,而应使用ByteBuffer
。要创建它,请使用ByteBuffer.allocateDirect()
(直接部分表示它不使用内部数组,而是“直接”内存。)JNI和JNA应该自动检测到这一点并将指针传递给本机库。
答案 1 :(得分:0)
经过阅读后,看来这不是最好的idea。我最终使用它将本机数据传递到BufferedImage
。
import java.awt.image.DataBuffer;
import java.nio.ByteBuffer;
public class DirectDataBuffer extends DataBuffer {
protected ByteBuffer directByteBuffer;
public DirectDataBuffer(ByteBuffer directByteBuffer) {
super(TYPE_BYTE, directByteBuffer.capacity());
this.directByteBuffer = directByteBuffer;
}
public int getElem(int bank, int i) {
return directByteBuffer.get(i);
}
public void setElem(int bank, int i, int val) {
directByteBuffer.put(i, (byte)val);
}
public ByteBuffer getDirectByteBuffer() {
return directByteBuffer;
}
}