JNI: накладные расходы на хранение ссылок на объекты Java в собственном коде? - PullRequest
4 голосов
/ 25 мая 2011

Я собираюсь интегрировать JRE в приложение C ++ с помощью JNI.

Каковы затраты на хранение большого количества ссылок на объекты Java в приложении C ++ ( глобальные ссылки на языке JNI)?

Есть ли какие-либо проблемы, о которых мне следует знать в связи с этим подходом (кроме очевидных, таких как ручное освобождение ссылок)?

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

(а) накладные расходы такие же, как если бы вы делали это с Java.Вы предотвращаете сбор мусора для объектов.

(b) Удержание ссылок на объекты через вызовы JNI может быть фатальным для JVM, если вы не сделаете это правильно.Вам необходимо внимательно прочитать раздел о глобальных и локальных ссылках в спецификации JNI.Вам также необходимо рассмотреть возможность использования слабых ссылок вместо глобальных.

0 голосов
/ 26 мая 2011

Это скорее мнение, чем ответ, но, учитывая, что у вас есть выбор, я настоятельно рекомендую не использовать JNI, а скорее обмениваться данными между вашим приложением C ++ и виртуальной машиной Java, используя другой механизм, такой как Sockets или веб-сервисы.Если вы все сделаете правильно, решение JNI будет явно намного быстрее, чем любая из этих альтернатив, но если производительность не имеет решающего значения, то мой опыт работы с JNI состоит в том, что его лучше избегать.) если вы не управляете своими Java-объектами JNI правильно, произойдут очень плохие вещи - в том числе и просто умирающая виртуальная машина.Я также обнаружил, что код JNI очень сложно протестировать.

...