JNI
Технология JNI позволяет из программы на Java обратиться к программе на C/C++ и наоборот.
JNI пример
Рассмотрим пример вызова функций в программе на С++ из программы на Java. Сначала сделаем простое приложение на Java.
Java приложение
Строим приложение: имя приложения JNI_App, главный класс — JNI_App_Class:
здесь метод fromDLL отмечен как native, этот метод будет реализован на C++.
В строке
мы из нашего приложения на Java обращаемся к программе на C++.
Прежде чем заняться реализацией метода fromDLL на C++ создадим заголовочный файл. Для этого используем утилиту javah из папки bin Java каталога.
Заголовочный файл
Схема такова:
здесь утилита javah работает с нашим классом JNI_App_Class.class.
Если запустить на выполнение схему, то получим ошибку. Схему в реальном случае надо доработать, указав путь к классу, т.е. classpath. На моём компьютере этот класс находится в D:MySiteJavaCodeJNI_Appbuildclasses. Указав путь к классу JNI_App_Class.class, получаем:
Ещё одно обстоятельство: заголовочный файл jni_md из C:Program FilesJavajdk1.6.0_16includewin32 копируем в C:Program FilesJavajdk1.6.0_16include, там находится jni.
Запускаем javah и получаем заголовочный файл на C++:
Настал момент создать dll на C++, в которой и будет использован наш заголовочный файл.
Как создать DLL?
Делаем в Visual C++ новый проект: Win32 — > Консольное приложение Win32, имя «JNI_DLL», тип приложения — DLL. Не забудьте выбрать «Не использовать предварительно скомпилированные заголовки».
Скопируем в папку этого проекта заготовленный в предыдущем разделе заголовочный файл pack_JNI_App_Class.h и присоединим его к проекту.
Теперь сделаем новый файл pack_JNI_App_Class.cpp, где реализуем функцию fromDLL:
Компилируем наше C++ приложение, получаем длл — JNI_DLL.dll.
java.library.path
Приложение на Java будет искать нашу длл в каталогах, указанных в java.library.path. Чтоб получить список этих каталогов, делаем так:
System.out.println(path);
Мы можем поместить длл JNI_DLL.dll в любой из этих каталогов и приложение найдёт её там. Но можно изменить java.library.path. Просто добавим к PATH путь к новому каталогу, где и будем хранить наши длл. После изменения PATH надо перезапустить IDE.
Итак, создаём новый каталог MyJNILibrary, добавляем путь к нему в переменную среды PATH. Копию полученной длл JNI_DLL.dll помещаем в MyJNILibrary.
Теперь всё готово для обращения из приложения на Java к длл на C++. Запускаем java-приложение JNI_App и получаем результат из длл: