Вызов функции библиотеки C ++ с использованием JNI и какой процесс выполняет эту библиотеку C ++ - PullRequest
0 голосов
/ 02 июля 2019

Я новичок в Java и JNI. Этот вопрос может быть очень новым. У меня есть библиотека C ++ и Java-приложение, которое интерны вызывают функцию C ++, используя концепции JNI.

Насколько я понимаю, JVM загружает C ++ dll / SO в пространство JVM перед вызовом вызова собственной функции.

Если мое понимание JVM верно для JNI. Может кто-нибудь сказать мне, кто / кто собирается выполнять библиотечную функцию C ++, которая загружается внутри JVM.
Допустим, для C ++ существует стандартный динамический компоновщик-загрузчик, который обрабатывает часть динамического выполнения C ++ и выполняет все машинные инструкции.

В случае загруженных JVM библиотек JNI (в данном случае библиотек C ++), JVM выполняет эти библиотеки? Если да, то использует ли он свою память для выполнения нативной функции?

Заранее спасибо.

1 Ответ

0 голосов
/ 02 июля 2019

Язык Java позволяет пометить определенные методы как native. Собственный интерфейс Java позволяет связать эти методы Java с адресом функции в собственном коде. Когда вы System.loadLibrary библиотека, которая содержит собственный код, JVM будет делать две вещи:

  • Найдите специально названные функции , такие как Java_pkg_Cls_f_ILjava_lang_String_2, и свяжите это с функцией f в классе pkg.Cls.
  • Позвоните JNI_OnLoad, если он существует в библиотеке. Это может выполнить инициализацию и опционально связать больше собственных методов, используя registerNatives.

После этого нативная библиотека действительно находится в пространстве памяти процесса, как и любая другая библиотека (скажем, libcurl или libssl). Когда вы на самом деле вызываете один из методов native, JVM найдет адрес функции и использует собственную инструкцию call для перехода в функцию. Функция будет выполняться как часть трассировки стека этого потока и будет отображаться как таковая как в JVM, так и в трассировках собственного стека.

В более сложных случаях библиотека может порождать дополнительные нативные потоки. Они работают как обычные потоки в нативном коде и невидимы для JVM. Если эти потоки также должны взаимодействовать с JVM, разработчик может присоединить к ним.

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