使用 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;
    }
}