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:

Компілюємо нашу С ++ програму, отримуємо длл - 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 ++