Что такое 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. Единственным вопросом остается производительность - в каких случаях стоит обратиться к нативному коду, а в каких достаточно воспользоваться стандартными средствами.