Что такое JNI?
Java Native Interface (JNI) — стандартный механизм для запуска кода, который написан на языках С/С++ или Ассемблера, и скомпонован в виде динамических библиотек, позволяет не использовать статическое связывание. Это даёт возможность вызова функции С/С++ из программы на Java, и наоборот.
Если говорить кратко, JNI - механизм, связывающий Java и C/C++ в одно целое.
Как пользоваться: Java
Со стороны Java нам нужно описать класс, загружающий динамическую библиотеку и имеющий в себе описание функций, расположенных в библиотеке:
|
|
Как пользоваться: С
Следующим этапом необходимо создать заголовочный файл библиотеки для дальнейшей работы с динамической библиотекой:
|
|
После выполнения данных команд в терминале мы получим файл Main.h
примерно такого содержания:
|
|
Как видим, в нашем заголовочном файле уже описана функция Java_Main_libraryFunc
, которая расположена в классе Main
и называется libraryFunc
. В динамической библиотеке функция принимает дополнительные аргументы - окружение и класс.
Переходим к файлу Main.c
, в котором опишем реализацию функции Java_Main_libraryFunc
:
|
|
Теперь этот небольшой модуль нужно скомпилировать в динамическую библиотеку:
|
|
Также нужно иметь ввиду, что разрядность библиотеки должна быть такой же, как и разрядность JVM.
Связываем вместе
После того, как библиотека скомпилирована, достаточно загрузить ее и вызвать нужную функцию:
|
|
Заключение
JNI - отличное средство для более близкого взаимодействия с системой. Все, что нельзя сделать средствами чистой Java, можно сделать на С/С++ и вызвать из Java. Единственным вопросом остается производительность - в каких случаях стоит обратиться к нативному коду, а в каких достаточно воспользоваться стандартными средствами.