Jni - java native interface - приклад
Переклад не дасть загальної ідеї, яка полягає в тому, що з JVM можна запустити код, який написаний на будь-якої компільовані мови (наприклад на C) і лежить на диску у вигляді .dll (для Unix це зазвичай .so)
JNI був придуманий і реалізований для тих, хто потребує виклики, які JAVA зробити не може зовсім - це якісь машино-залежні команди або звернення до API операційної системи, звернення до драйверів і прочая.
Досить повний опис можна знайти тут: Java Native Interface
А нижче зроблений дуже простий варіант використання JNI. Приклад зроблений для того, щоб побачити наскільки нескладно використовувати цей механізм.
1. Створюємо звичайний клас на JAVA, але той метод, який повинен використовувати dll описуємо як native. Крім цього використовуємо виклик, який завантажує нашу dll.
public class JniTest
System. loadLibrary ( "JniTest");
// звертаємо увагу на слово native
public native int showString (String message);
Тепер компілюємо наш приклад
javac JniTest. java
Якщо нічого страшного не сталося, то по ідеї ми повинні отримати файл JniTest.class.
Тепер опрацюємо його утилітою javah. Ця утиліта створить нам .h файл для нашої програми.
Важливо: треба писати файл без розширення.
javah -classpath. JniTest
Отримуємо файл JniTest.h ось такого виду.
У ньому слід звернути увагу на обробку рядків. Решта змінні звичайно не такі складні. А тут бачимо, що треба витягнути рядок з Unicode в звичайний char.
Тепер зробимо dll для нашого проекту. Краще було б, щоб в системі вже був прописаний шлях до компілятора.
JAVA_HOME - це змінна середовища, яку я завжди прописую. Взагалі це шлях до директорії зі встановленою JAVA - наприклад, C: \ j2sdk15. (Думаю, що це зрозуміло)
cl -I% JAVA_HOME% \ include -I% JAVA_HOME% \ include \ win32 -LD JniTest.cpp -FeJniTest.dll
cl - це компілятро С ++ з Visual C ++. Ви можете використовувати будь-який інший компілятор. Тут важливо зібрати наші вихідні на Сі для отримання DLL.
Видно, що результатом компіляції повинна бути JniTest.dll. До речі, для Unix-систем повинен бути файл виду libJniTest.so. Ось така особливість. Потрібен префікс lib.
Тепер створюємо тестовий приклад.