Введение

Интерфейс внешних функций

В разработке программного обеспечения Java Native Interface (JNI) — это программный фреймворк интерфейса внешних функций, позволяющий Java-коду, выполняющемуся в виртуальной машине Java (JVM), вызывать и быть вызываемым из нативных приложений (программ, специфичных для аппаратной и операционной платформы) и библиотек, написанных на других языках, таких как C, C++ и ассемблер.

Цели

JNI позволяет программистам создавать собственные методы для обработки ситуаций, когда приложение невозможно полностью реализовать на языке Java, например, когда стандартная библиотека классов Java не поддерживает платформенно-зависимые функции или библиотеки. JNI также используется для адаптации существующего приложения (написанного на другом языке программирования) для доступа из Java-приложений. Многие классы стандартной библиотеки зависят от JNI для предоставления функциональности разработчику и пользователю, например, для операций ввода-вывода с файлами и работы со звуком. Включение в стандартную библиотеку реализаций API, чувствительных к производительности и платформе, позволяет всем Java-приложениям безопасно и платформенно-независимо использовать эту функциональность. Фреймворк JNI позволяет нативным методам использовать Java-объекты так же, как это делает Java-код. Нативный метод может создавать Java-объекты, а затем проверять и использовать их для выполнения своих задач. Нативный метод также может проверять и использовать объекты, созданные кодом Java-приложения. JNI могут вызывать только приложения и подписанные апплеты. Приложение, использующее JNI, теряет платформенную переносимость, предоставляемую Java (частичным решением является написание отдельной реализации JNI-кода для каждой платформы и динамическая загрузка соответствующей реализации Java в зависимости от операционной системы). Нативный код может не только взаимодействовать с Java, но и использовать графические компоненты Java, что возможно благодаря Java AWT Native Interface. Процесс практически идентичен, с некоторыми небольшими изменениями. Java AWT Native Interface доступен начиная с J2SE 1.3. JNI также обеспечивает прямой доступ к ассемблерному коду, минуя C-мост. Доступ к Java-приложениям из ассемблерного кода возможен аналогичным образом.

Альтернативы

Собственная реализация Microsoft виртуальной машины Java (Visual J++) имела аналогичный механизм вызова нативного кода из Java, называемый Raw Native Interface (RNI). Кроме того, она предоставляла простой способ вызова существующего нативного кода, не предназначенного для работы с Java, например (но не ограничиваясь этим) API Windows, под названием J/Direct. Однако после судебного разбирательства между Sun и Microsoft относительно этой реализации, Visual J++ больше не поддерживается. RNI было проще в использовании, чем JNI, поскольку не требовалось отслеживать указатель на среду Java. Вместо этого, ко всем объектам Java можно было обращаться напрямую. Для этого использовался инструмент, генерирующий заголовочные файлы из классов Java. Аналогично, J/Direct было проще использовать, чем необходимую промежуточную нативную библиотеку и JNI. Java Native Access (JNA) – это библиотека, разработанная сообществом, которая предоставляет программистам Java простой доступ к нативным общим библиотекам без использования JNI. Однако это требует распространения зависимой JAR-библиотеки. Выбор между JNI, который сложнее в кодировании, и JNA, который работает медленнее. JNI является частью базовой платформы Java.