Вместо использования массива вы можете использовать прямой буфер ByteBuffer.allocateDirect (). У этого есть адрес в поле, и этот адрес не изменяется в течение жизни ByteBuffer. Прямой ByteBuffer использует минимальное пространство кучи. Вы можете получить адрес, используя отражение.
Вы можете использовать Unsafe для получения адреса, проблема в том, что GC может переместить его в любое время. Объекты не фиксируются в памяти.
В JNI вы можете использовать специальные методы для копирования данных в / из объектов Java, чтобы избежать этой проблемы (и других). Я предлагаю вам использовать их, если вы хотите обмениваться данными между объектами с кодом C.