получение ячейки памяти для байтового массива Java с помощью sun.misc.unsafe - PullRequest
0 голосов
/ 04 октября 2018

Я хочу передать ячейку байтового массива в вызов jni, чтобы массив не копировался.Здесь есть вопрос здесь , который подсказывает, что это возможно с sun.misc.Unsafe.Есть ли пример того, как это можно сделать?

Вариант использования: у меня есть BufferedImage, и у меня есть метод OpenGL, который принимает указатель.Я знаю, что очевидная вещь, которую нужно сделать - это выделить прямой байтбуфер, но я хочу сэкономить на копии.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

После некоторого чтения кажется, что это не самая лучшая идея .Я использовал это для передачи собственных данных в 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;
    }
}
0 голосов
/ 04 октября 2018

Прежде всего, если это вообще возможно, перейдите на JNA, это намного удобнее для пользователя (не требует компиляции файлов c)

Если вы хотите передать данные непосредственно в нативный код, не делайтеиспользовать массив, но вместо этого использовать ByteBuffer.Чтобы создать его, используйте ByteBuffer.allocateDirect() (прямая часть означает, что он не использует внутренний массив, а 'прямую' память.) JNI и JNA должны автоматически обнаружить это и передать указатель на собственную библиотеку.

...