Я столкнулся с аналогичной проблемой при интеграции Java и JOGL - мое решение состояло в том, чтобы управлять ресурсами буфера в C и использовать JNI для передачи указателя на буфер в Java с помощью метода
jobject NewDirectByteBuffer(JNIEnv * env, void * address, jlong capacity);
найдено в jni.h. Когда вам нужно обновить смещение в буфере, используйте отражение, чтобы вручную изменить поле «адрес», найденное в java.nio.Buffer. Если добавление большего количества элементов приведет к превышению емкости буфера в C, используйте список массивов в C и укажите точку прямого буфера для массива, поддерживающего список.