Зачем в Java нужен модификатор native и для чего в классе Object некоторые методы помечены им?
Ответ
native указывает, что метод реализуется не в Java коде. В связке с JNI (Java Native Interface) идёт.
Как правило, подразумевается, что метод реализован в c коде. Работа с диском, сеть и т.п. реализованы в Си части, и Java обёртки вызывают эти методы.
Под рукой сейчас только Ubuntu. Пример на ней покажу.
Есть у вас основной Java файл Main.java
public class Main {
public native int intMethod(int i);
public static void main(String[] args) {
System.loadLibrary("Main");
System.out.println(new Main().intMethod(4));
}
}
И c файл Main.c
#include
JNIEXPORT jint JNICALL Java_Main_intMethod (JNIEnv *env, jobject obj, jint i) {
return i * 2;
}
Ещё Makefile для сборки:
.PHONY: all clean
all:
javac Main.java
javah -jni Main
gcc -shared -fpic -o libMain.so -I$${JAVA_HOME}/include -I$${JAVA_HOME}/include/linux Main.c
java -Djava.library.path=. Main
clean:
rm -f *.class *.so Main.h
Запустим всё это дело:
javac Main.java
javah -jni Main
gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \
-I${JAVA_HOME}/include/linux Main.c
java -Djava.library.path=. Main
На экране увидите: 8
Предварительные настройки:
Установлен jdk, самой собой.
Установить essential: sudo apt-get install build-essential
Путь прописать до Java. У меня это export JAVA_HOME='/usr/java/jdk1.8.0_131'
Пример показывает, как из Java вызвать Си код и вернуть результат.
Когда это надо?
OS зависимые вещи.
Какие-то сложные вычисления. Часто математические библиотеки написаны на Си.
Комментариев нет:
Отправить комментарий