Есть ли способ передать массив Java в C через JNI, не создавая его копию? - PullRequest
8 голосов
/ 08 марта 2011

Я понимаю, что используя GetDoubleArrayElements, именно JVM решает, копировать или нет элементы массива. В таком случае, есть ли способ избежать копирования? Если нет, есть ли другой способ перехода с Java на C без копирования? Я передаю очень большие массивы, и я хотел бы избежать копии. Спасибо

1 Ответ

4 голосов
/ 11 марта 2011

В справочнике JNI написано:

В JDK / JRE 1.1 программисты могут использовать функции Get / ReleaseArrayElements для получения указателя на примитивные элементы массива. Если виртуальная машина поддерживает закрепление, возвращается указатель на исходные данные ; в противном случае копия сделана.

Новые функции, представленные в JDK / JRE 1.3, позволяют нативному коду получать прямой указатель на элементы массива, даже если виртуальная машина не поддерживает закрепление.

Этими "новыми функциями" являются GetPrimitiveArrayCritical и ReleasePrimitiveArrayCritical, которые полностью отключают сборку мусора и поэтому должны использоваться с осторожностью. Таким образом, в итоге это проблема виртуальной машины, а не проблема API. Не забывайте, что без закрепления сборщик мусора может решить сжать кучу и физически переместить ваш массив, так что прямой указатель будет бесполезен в конце концов.

Как предположил Питер, вы могли бы работать с java.nio.DoubleBuffer вместо использования массивов. Функция JNI

void* GetDirectBufferAddress(JNIEnv* env, jobject buf);

позволяет получить к нему доступ.

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