Во время игры в эту головоломку (это Java-игра с ключевыми словами) я наткнулся на native
ключевое слово.
Для чего используется ключевое слово native в Java?
java
java-native-interface
native
keyword
whirlwin
источник
источник
Ответы:
native
Ключевое слово применяется к методу , чтобы указать , что метод реализован в нативном коде с помощью JNI (Java Native Interface).источник
Минимальный исполняемый пример
Main.java
main.C
Скомпилируйте и запустите:
Вывод:
Протестировано на Ubuntu 14.04 AMD64. Также работал с Oracle JDK 1.8.0_45.
Пример на GitHub для вас, чтобы играть с.
Символы подчеркивания в именах пакетов / файлов Java должны быть экранированы
_1
в имени функции C, как указано в разделе: Вызов функций JNI в имени пакета Android, содержащем подчеркиваниеинтерпретация
native
позволяет вам:Это может быть использовано для:
с компромиссом более низкой мобильности.
Вы также можете вызывать Java из C, но вы должны сначала создать JVM в C: Как вызывать функции Java из C ++?
Аналогичные нативные API расширения также присутствуют во многих других «языках ВМ» по тем же причинам, например, Python , Node.js , Ruby .
Android NDK
Концепция в этом контексте точно такая же, за исключением того, что для ее настройки необходимо использовать шаблон Android.
Официальный репозиторий NDK содержит «канонические» примеры, такие как приложение hello-jni:
В
unzip
случае.apk
с NDK на Android O вы можете увидеть предварительно скомпилированный.so
код, соответствующий нативному кодуlib/arm64-v8a/libnative-lib.so
.Подтверждение TODO: кроме того,
file /data/app/com.android.appname-*/oat/arm64/base.odex
говорит, что это общая библиотека, которая, как мне кажется, является предварительно скомпилированным AOT .dex, соответствующим файлам Java в ART, см. Также: Что такое файлы ODEX в Android? Так может быть, Java на самом деле также запускается черезnative
интерфейс?Пример в OpenJDK 8
Давайте найдем найти, где
Object#clone
определено в jdk8u60-b27.Сделаем вывод, что это реализовано с помощью
native
вызова.Сначала мы находим:
что приводит нас к jdk / src / share / classes / java / lang / Object.java # l212 :
Теперь самое сложное - найти место, где клон находится среди всего косвенного. Вопрос, который мне помог, был:
который найдет файлы C или C ++, которые могут реализовать нативные методы Object. Это приводит нас к jdk / share / native / java / lang / Object.c # l47 :
что приводит нас к
JVM_Clone
символу:что приводит нас к точке доступа / src / share / vm / prims / jvm.cpp # l580 :
Развернув кучу макросов, мы приходим к выводу, что это точка определения.
источник
static
native
метода Java второй параметр функции C ++ имеет тип,jclass
а не типjobject
.Он отмечает метод, который будет реализован на других языках, а не на Java. Он работает вместе с JNI (Java Native Interface).
В прошлом для написания критических разделов, касающихся производительности, использовались собственные методы, но с ускорением работы Java это стало менее распространенным явлением. Родные методы в настоящее время необходимы, когда
Вам нужно вызвать библиотеку из Java, написанную на другом языке.
Вам необходимо получить доступ к системным или аппаратным ресурсам, доступным только с другого языка (обычно C). На самом деле, многие системные функции, которые взаимодействуют с реальным компьютером (например, с дисковым и сетевым вводом-выводом), могут делать это только потому, что они вызывают собственный код.
См. Также Спецификация собственного интерфейса Java
источник
currentTimeMillis
являются частью JDK и снабжены комментариями,native
потому что реализация находится в самом исходном коде JDK. Маловероятно, что реализация использует ассемблер; он, вероятно, вызывает метод API операционной системы, над которой работает JVM. Например, в Windows это может вызвать метод DLLGetSystemTime
в kernel32.dll. На другой ОС у него будет другая реализация. Однако, когда вы используетеnative
метод, который вы пишете (в отличие от метода JDK), вы должны предоставить реализацию, используя JNI.currentTimeMillis
помечен как нативный в,java.lang.System
так что он использует JNI, не так ли?Прямо из в спецификации языка Java :
источник
Как ответил SLaks,
native
ключевое слово для вызова нативного кода.Он также используется GWT для реализации методов javascript.
источник
функции, которые реализуют нативный код, объявляются нативными.
http://en.wikipedia.org/wiki/Java_Native_Interface
источник
NATIVE - это не модификатор доступа. Он может применяться только к МЕТОДУ. Это указывает на платформо-зависимую реализацию метода или кода.
источник
native - это ключевое слово в java, которое используется для создания неосуществленной структуры (метода) как абстрактной, но это будет зависеть от платформы, такой как собственный код, и выполняться из собственного стека, а не из стека java.
источник
native
является ключевым словом в Java, оно указывает на платформу зависит.native
методы являются интерфейсом между Java ( JNI ) и другими языками программирования.источник
Ява
native
Метод обеспечивает механизм для кода Java для вызова собственного кода ОС либо по функциональным соображениям, либо по соображениям производительности.Пример:
В соответствующем
Runtime.class
файле в OpenJDK, расположенном вJAVA_HOME/jmods/java.base.jmod/classes/java/lang/Runtime.class
, содержатся эти методы и помечены их с помощьюACC_NATIVE
(0x0100
), и эти методы не содержат атрибута Code , что означает, что эти методы не имеют никакой реальной логики кодирования вRuntime.class
файле:availableProcessors
: помечены как родные и без атрибута кодаfreeMemory
: помечены как родные и без атрибута кодаtotalMemory
: помеченный как родной и без атрибута кодаmaxMemory
: помечены как родные и без атрибута кодаgc
: помечены как родные и без атрибута кодаФактически логика кодирования находится в соответствующем файле Runtime.c :
И эти
C
кодировки скомпилированы вlibjava.so
(Linux) илиlibjava.dll
(Windows) файл, расположенный по адресуJAVA_HOME/jmods/java.base.jmod/lib/libjava.so
:Ссылка
источник