Как стандартные библиотеки Java взаимодействуют с нативным кодом? - PullRequest
1 голос
/ 15 июля 2010

Они используют что-то вроде Mono's PInvoke? Или это больше похоже на внутренние вызовы, зарегистрированные до запуска среды выполнения? Есть ли в Java базовая библиотека для обработки собственных вызовов, таких как mscorlib.dll? Если я хочу вызвать JVM в C-коде, будут ли библиотеки искать файлы .so / .dll? Имеет ли это значение для стандартных библиотек Java, если я статически связываю все библиотеки JRE?

Ответы [ 4 ]

6 голосов
/ 15 июля 2010

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

Что касается вызова JVM из кода C, JVM использует общие библиотеки (DLL, SO,так далее).Быстрый поиск исходного кода JDK 6 не обнаруживает ни одного System.loadLibrary () для основной поддержки ядра (например, собственных методов в Object, String и т. Д.).Это наводит меня на мысль, что нативный код для этих методов, который, судя по содержимому каталога JRE / bin, находится в DLL, явно связан с java.exe (и javaw.exe в Windows).

Когда я в последний раз смотрел этот материал, требования для вызова JVM из кода C были хорошо документированной частью JNI - я настоятельно рекомендую вам обратиться к этому документу, чтобы продолжить.Мы даже дошли до того, что успешно написали собственный упаковщик / загрузчик C для JVM IBM AS / 400 Java 1.1.

1 голос
/ 15 июля 2010

Они используют собственный интерфейс Java (JNI).

Я никогда не вызывал JVM из C, поэтому не знаю об этом.

0 голосов
/ 15 июля 2010

" Java Native Access (JNA) обеспечивает программам на Java легкий доступ к собственным разделяемым библиотекам (DLL в Windows) без написания чего-либо, кроме кода Java" (цитата из их домашней страницы).

Лично никогда не пробовал.

0 голосов
/ 15 июля 2010

Здесь приведен пример того, как запустить JVM из вашей C-программы:

http://www.inonit.com/cygwin/jni/invocationApi/c.html

...