Как JVM вызывает собственный метод в хост-среде - PullRequest
1 голос
/ 25 февраля 2011

Сегодня я читаю о родном интерфейсе Java. Кстати, у меня есть сомнения. Скажем для примера: если нам нужно выполнить операцию ввода-вывода в программе Java, мы применяем Java API для I Операции ввода / вывода. Более того, на низком уровне его следует сопоставить с обработкой операций ввода / вывода на уровне ОС. Сомнение заключается в том, как API Java взаимодействует с собственными методами ввода / вывода в основной операционной системе.

Коротко и сладко, я слышал, что некоторые из методов в JDK реализованы нативно. Как эти нативные методы вызываются Java API. Я предполагаю, что это будет JNI (Java Native Interface).

Может ли кто-нибудь прояснить мои сомнения.

Спасибо

Nuwan Arambage

Ответы [ 2 ]

3 голосов
/ 25 февраля 2011

Методы в Java могут быть помечены native, чтобы указать, что их реализация написана не в Java или в байт-коде, а скорее в чем-то зависящем от платформы. Например, операции ввода-вывода Java почти всегда реализуются как native методы, так что они могут использовать преимущества базового оборудования или интерфейса ОС на компьютере.

Нет никакой гарантии того, что методы native действительно реализованы. В реализации JVM от Sun (ныне Oracle) вы можете писать реализации для собственных методов, используя JNI для определения специально названных функций C, которые взаимодействуют с пользовательскими библиотеками для взаимодействия с кодом Java. Однако другая JVM могла бы реализовывать нативные методы совершенно по-другому. Фактически, сейчас я работаю над проектом по реализации JVM на JavaScript, и поэтому все нативные методы реализованы на JavaScript, а не на C.

Короче говоря, не существует "одного способа" реализации native методов. Весь смысл в том, чтобы обеспечить максимальную гибкость реализации библиотек JVM и Java, поэтому чем меньше задано поведение, тем лучше.

2 голосов
/ 25 февраля 2011

После загрузки собственной библиотеки методы связаны (интегрированы) в JVM. Java VM Spec использует термин привязка вместо связывание , чтобы избежать путаницы. Но это только формулировка.

Остальное просто. Есть некоторые операнды байт-кода, которые используются для вызова метода. И если это сообщение объявлено native , то вызывается связанный с ним собственный код. Параметры и результаты преобразуются, чтобы не было разницы, если мы вызываем нативный или не нативный метод.

Посмотрите на спецификацию invokevirtual, маркированный список охватывает случай native.

...