使用 sun.misc.unsafe 获取 java 字节数组的内存位置
getting the memory location for a java byte array using sun.misc.unsafe
我想将字节数组的内存位置传递给 jni 调用,这样就不必复制该数组。有一个问题 here 暗示这可以用 sun.misc.Unsafe 实现。是否有示例说明如何做到这一点?
用例是我有一个 BufferedImage 和一个接收指针的 OpenGL 方法。我知道显而易见的事情是分配一个直接的字节缓冲区,但我想保存在副本上。
首先,如果可行的话,迁移到 JNA,它对用户更友好(不需要你编译 c 文件)
如果您想将数据直接传递给本机代码,请不要使用数组,而应使用 ByteBuffer
。要创建它,请使用 ByteBuffer.allocateDirect()
(直接部分表示它不使用内部数组,而是使用 'direct' 内存。)JNI 和 JNA 应该自动检测到它并将指针传递给本机库。
看了一些资料,好像不是最好的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;
}
}
我想将字节数组的内存位置传递给 jni 调用,这样就不必复制该数组。有一个问题 here 暗示这可以用 sun.misc.Unsafe 实现。是否有示例说明如何做到这一点?
用例是我有一个 BufferedImage 和一个接收指针的 OpenGL 方法。我知道显而易见的事情是分配一个直接的字节缓冲区,但我想保存在副本上。
首先,如果可行的话,迁移到 JNA,它对用户更友好(不需要你编译 c 文件)
如果您想将数据直接传递给本机代码,请不要使用数组,而应使用 ByteBuffer
。要创建它,请使用 ByteBuffer.allocateDirect()
(直接部分表示它不使用内部数组,而是使用 'direct' 内存。)JNI 和 JNA 应该自动检测到它并将指针传递给本机库。
看了一些资料,好像不是最好的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;
}
}