В справочнике JNI написано:
В JDK / JRE 1.1 программисты могут использовать функции Get / ReleaseArrayElements для получения указателя на примитивные элементы массива. Если виртуальная машина поддерживает закрепление, возвращается указатель на исходные данные ; в противном случае копия сделана.
Новые функции, представленные в JDK / JRE 1.3, позволяют нативному коду получать прямой указатель на элементы массива, даже если виртуальная машина не поддерживает закрепление.
Этими "новыми функциями" являются GetPrimitiveArrayCritical
и ReleasePrimitiveArrayCritical
, которые полностью отключают сборку мусора и поэтому должны использоваться с осторожностью. Таким образом, в итоге это проблема виртуальной машины, а не проблема API. Не забывайте, что без закрепления сборщик мусора может решить сжать кучу и физически переместить ваш массив, так что прямой указатель будет бесполезен в конце концов.
Как предположил Питер, вы могли бы работать с java.nio.DoubleBuffer
вместо использования массивов. Функция JNI
void* GetDirectBufferAddress(JNIEnv* env, jobject buf);
позволяет получить к нему доступ.