Java Native Interface: Взаимодействие с нативным кодом
Java Native Interface
JNI (Java Native Interface): интерфейс для вызова нативных приложений (C, C++) из Java. Расширяет возможности Java, обеспечивает доступ к платформенным функциям и повышает производительность.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Интерфейс внешних функций
Foreign function interface
В разработке программного обеспечения Java Native Interface (JNI) — это программный фреймворк интерфейса внешних функций, позволяющий Java-коду, выполняющемуся в виртуальной машине Java (JVM), вызывать и быть вызываемым из нативных приложений (программ, специфичных для аппаратной и операционной платформы) и библиотек, написанных на других языках, таких как C, C++ и ассемблер.
In software design, the Java Native Interface (JNI) is a foreign function interface programming framework that enables Java code running in a Java virtual machine (JVM) to call and be called by native applications (programs specific to a hardware and operating system platform) and libraries written in other languages such as C, C++ and assembly.
Цели
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-приложениям из ассемблерного кода возможен аналогичным образом.
JNI enables programmers to write native methods to handle situations when an application cannot be written entirely in the Java programming language, e. g. when the standard Java class library does not support the platform specific features or program library. It is also used to modify an existing application (written in another programming language) to be accessible to Java applications. Many of the standard library classes depend on JNI to provide functionality to the developer and the user, e. g. file I/O and sound capabilities. Including performance and platform sensitive API implementations in the standard library allows all Java applications to access this functionality in a safe and platform independent manner. The JNI framework lets a native method use Java objects in the same way that Java code uses these objects. A native method can create Java objects and then inspect and use these objects to perform its tasks. A native method can also inspect and use objects created by Java application code. Only applications and signed applets can invoke JNI. An application that relies on JNI loses the platform portability Java offers (a partial workaround is to write a separate implementation of JNI code for each platform and have Java detect the operating system and load the correct one at runtime). Not only can native code interface with Java, it can also draw on a Java , which is possible with the Java AWT Native Interface. The process is almost the same, with just a few changes. The Java AWT Native Interface is only available since J2SE 1.3. JNI also allows direct access to assembly code, without even going through a C bridge. Accessing Java applications from assembly is possible in the same way.
Альтернативы
Собственная реализация 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.
Microsoft's proprietary implementation of a Java Virtual Machine (Visual J++) had a similar mechanism for calling native code from Java, called the Raw Native Interface (RNI). In addition, it had an easy way to call existing native code that was not itself aware of Java, such as (but not limited to) the Windows API, called J/Direct. However, following the Sun–Microsoft litigation about this implementation, Visual J++ is no longer maintained. RNI was less clumsy to use than JNI, because no bookkeeping with a Java environment pointer was needed. Instead, all Java objects could be accessed directly. To facilitate this, a tool was used that generated header files from Java classes. Similarly, J/Direct was easier to use than using the necessary intermediate native library and JNI. Java Native Access (JNA) is a community developed library that provides Java programers easy access to native shared libraries without using JNI. However, this requires the redistribution of the dependent jar library. The tradeoff is between JNI being harder to code and JNA being slower. JNI is built in to core Java.