Java поток неуправляемой памяти - PullRequest
1 голос
/ 04 января 2012

Я пытаюсь разработать API, чтобы позволить моему приложению Java взаимодействовать с собственной средой передачи сообщений между процессами. Сообщения уже существуют в неуправляемой памяти. Получив сообщение, я хочу получить поток для чтения и записи в сообщение. Хотя я понимаю основы JNI, я пытаюсь понять, какие стандартные классы Java могут помочь создать поток в неуправляемую память.

Буду благодарен за любые указатели

Привет

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Я бы использовал прямой ByteBuffer.Вы можете изменить адрес и ограничение через JNI.Как только это произойдет, вы можете читать или изменять что-либо в этом ByteBuffer, и он изменится на «неуправляемый» размер.

ByteBuffer поддерживает младший и старший порядковый номер и чтение и запись всех примитивных типов.1004 *

Простой способ сделать это - использовать класс Unsafe.Он поддерживает доступ к примитивам в произвольной области памяти (как указатель). Во многих случаях он также сводится к одной инструкции машинного кода.Небезопасный не является безопасным или переносимым, и если вы можете использовать ByteBuffer, это лучший выбор.

2 голосов
/ 05 января 2012

JNI API имеет метод с именем NewDirectByteBuffer , который объявлен как:

jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity);

То, что он делает, это берет область памяти, описанную void*, указывающей на ее верхнюю часть и длину, и создает ByteBuffer , обертывающий ее. Это не копия; изменения в буфере изменят данные в области памяти.

ByteBuffer имеет довольно богатый API. Не существует стандартного способа создания InputStream, который читает из, или OutputStream, который пишет в один, но такие вещи было бы очень легко написать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...