GrabDuck

JNI

:

JNI

Технология JNI позволяет из программы на Java обратиться к программе на C/C++ и наоборот.

JNI пример

Рассмотрим пример вызова функций в программе на С++ из программы на Java. Сначала сделаем простое приложение на Java.

Java приложение

Строим приложение: имя приложения JNI_App, главный класс — JNI_App_Class:

здесь метод fromDLL отмечен как native, этот метод будет реализован на C++.

В строке

app.fromDLL("Java");

мы из нашего приложения на Java обращаемся к программе на C++.

Прежде чем заняться реализацией метода fromDLL на C++ создадим заголовочный файл. Для этого используем утилиту javah из папки bin Java каталога.

Заголовочный файл

Схема такова:

javah -jni JNI_App_Class

здесь утилита javah работает с нашим классом JNI_App_Class.class.

Если запустить на выполнение схему, то получим ошибку. Схему в реальном случае надо доработать, указав путь к классу, т.е. classpath. На моём компьютере этот класс находится в D:\MySite\JavaCode\JNI_App\build\classes. Указав путь к классу JNI_App_Class.class, получаем:

javah -classpath .;D:\MySite\JavaCode\JNI_App\build\classes -jni pack.JNI_App_Class

Ещё одно обстоятельство: заголовочный файл jni_md из C:\Program Files\Java\jdk1.6.0_16\include\win32 копируем в C:\Program Files\Java\jdk1.6.0_16\include, там находится 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. Чтоб получить список этих каталогов, делаем так:

String path = System.getProperty("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 и получаем результат из длл:

retVal = Java and C++