Страницы

Поиск по вопросам

понедельник, 8 октября 2018 г.

Для чего в классе Object некоторые методы имеют модификатор native?

Зачем в 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 #include "Main.h"
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 зависимые вещи. Какие-то сложные вычисления. Часто математические библиотеки написаны на Си.

Комментариев нет:

Отправить комментарий