使用sun.misc.unsafe获取Java字节数组的内存位置

时间:2018-10-04 15:41:43

标签: java arrays unsafe

我想将字节数组的内存位置传递给jni调用,以便不必复制该数组。有一个问题here暗示着sun.misc.Unsafe可以实现。有一个如何做到这一点的例子吗?

用例是我有一个BufferedImage,并且我有一个采用指针的OpenGL方法。我知道显而易见的事情是分配一个直接的字节缓冲区,但我想保存在副本上。

2 个答案:

答案 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;
    }
}