Прекрасных вариантов не существует, так что вот такие уродливые:
Если вы используете Sun (сейчас Oracle) JRE 5.0 или 6.0, вы можете использовать следующее:
ByteBuffer buffer = ByteBuffer.allocateDirect(pageSize);
Method getAddress = buffer.getClass().getMethod("address");
long address = getAddress.invoke(buffer);
// and now send address to JNI
Для доступа к данным в Java используйте buffer . Чтобы получить доступ в JNI, приведите address к указателю. Оба будут видеть / изменять одни и те же данные.
Адрес должен быть выровнен по страницам, но чтобы быть уверенным в этом, вы можете выделить две страницы (наверняка будет достаточно места для полностью выровненной страницы). Затем вы выравниваете адрес на странице и применяете смещение для доступа ByteBuffer.
Еще одна опция для выделения буфера и собственных вызовов, которая работает на любой виртуальной машине, использует класс памяти JNA: http://jna.java.net/javadoc/com/sun/jna/Memory.html. Не пугайтесь с пакетом com.sun . Это с открытым исходным кодом и LGPL.