Mientras jugaba este rompecabezas (es un juego de trivia de palabras clave de Java), me encontré con la native
palabra clave.
¿Para qué se usa la palabra clave nativa en Java?
java
java-native-interface
native
keyword
torbellino
fuente
fuente
Respuestas:
La
native
palabra clave se aplica a un método para indicar que el método se implementa en código nativo utilizando JNI (Java Native Interface).fuente
Ejemplo ejecutable mínimo
Main.java
C Principal
Compilar y ejecutar:
Salida:
Probado en Ubuntu 14.04 AMD64. También trabajó con Oracle JDK 1.8.0_45.
Ejemplo en GitHub para que juegues.
Los caracteres de subrayado en los nombres de paquete / archivo Java deben escaparse con
_1
el nombre de la función C como se menciona en: Invocación de funciones JNI en el nombre del paquete de Android que contiene guión bajoInterpretación
native
Te permite:Esto podría usarse para:
con el compromiso de una menor portabilidad.
También es posible que llame a Java desde C, pero primero debe crear una JVM en C: ¿Cómo llamar a las funciones de Java desde C ++?
Las API de extensiones nativas análogas también están presentes en muchos otros "lenguajes VM" por las mismas razones, por ejemplo , Python , Node.js , Ruby .
Android NDK
El concepto es exactamente el mismo en este contexto, excepto que tiene que usar la plantilla de Android para configurarlo.
El repositorio oficial de NDK contiene ejemplos "canónicos" como la aplicación hello-jni:
En usted
unzip
y.apk
con NDK en Android O, puede ver el precompilado.so
que corresponde al código nativo debajolib/arm64-v8a/libnative-lib.so
.TODO confirma: además,
file /data/app/com.android.appname-*/oat/arm64/base.odex
dice que es una biblioteca compartida, que creo que es el .dex precompilado AOT correspondiente a los archivos Java en ART, vea también: ¿Qué son los archivos ODEX en Android? Entonces, ¿tal vez Java también se ejecute a través de unanative
interfaz?Ejemplo en OpenJDK 8
Busquemos encontrar dónde
Object#clone
se define en jdk8u60-b27.Concluiremos que se implementa con una
native
llamada.Primero encontramos:
lo que nos lleva a jdk / src / share / classes / java / lang / Object.java # l212 :
Ahora viene la parte difícil, encontrar dónde está el clon en medio de toda la indirección. La consulta que me ayudó fue:
que encontraría archivos C o C ++ que podrían implementar los métodos nativos de Object. Nos lleva a jdk / share / native / java / lang / Object.c # l47 :
lo que nos lleva al
JVM_Clone
símbolo:lo que nos lleva a hotspot / src / share / vm / prims / jvm.cpp # l580 :
Después de expandir un montón de macros, llegamos a la conclusión de que este es el punto de definición.
fuente
static
native
método Java, el segundo parámetro de la función C ++ es de tipojclass
y nojobject
.Marca un método, que se implementará en otros idiomas, no en Java. Funciona junto con JNI (Java Native Interface).
Los métodos nativos se usaron en el pasado para escribir secciones críticas de rendimiento, pero con Java cada vez más rápido, esto ahora es menos común. Actualmente se necesitan métodos nativos cuando
Debe llamar a una biblioteca desde Java que esté escrita en otro idioma.
Debe acceder a los recursos del sistema o hardware a los que solo se puede acceder desde el otro lenguaje (generalmente C). En realidad, muchas funciones del sistema que interactúan con una computadora real (disco y red IO, por ejemplo) solo pueden hacer esto porque llaman código nativo.
Consulte también la especificación de la interfaz nativa de Java
fuente
currentTimeMillis
son parte del JDK y están anotadosnative
porque la implementación está en el código fuente JDK. Es muy poco probable que la implementación use lenguaje ensamblador; probablemente llama a un método API del sistema operativo sobre el cual se ejecuta la JVM. Por ejemplo, en Windows puede llamar a un método DLLGetSystemTime
en kernel32.dll. En otro sistema operativo tendrá una implementación diferente. Sin embargo, cuando utilizanative
para un método que está escribiendo (a diferencia de un método JDK), debe proporcionar la implementación utilizando JNI.currentTimeMillis
está marcado como nativo, porjava.lang.System
lo que usa JNI, ¿no es así?Directamente desde la especificación del lenguaje Java :
fuente
Como respondió SLaks, la
native
palabra clave es para llamar a código nativo.También lo utiliza GWT para implementar métodos javascript.
fuente
Las funciones que implementan código nativo se declaran nativas.
http://en.wikipedia.org/wiki/Java_Native_Interface
fuente
NATIVE es un modificador sin acceso. Solo se puede aplicar a METHOD. Indica la implementación DEPENDIENTE DE LA PLATAFORMA del método o código.
fuente
native es una palabra clave en java, que se usa para hacer que la estructura (método) no implementada sea abstracta, pero dependería de la plataforma, como el código nativo, y se ejecutaría desde la pila nativa, no desde la pila java.
fuente
native
es una palabra clave en java, indica que depende de la plataforma.native
Los métodos son actos como interfaz entre Java ( JNI ) y otros lenguajes de programación.fuente
El
native
método Java proporciona un mecanismo para que el código Java llame al código nativo del sistema operativo, ya sea por razones funcionales o de rendimiento.Ejemplo:
En el
Runtime.class
archivo correspondiente en OpenJDK, ubicado enJAVA_HOME/jmods/java.base.jmod/classes/java/lang/Runtime.class
, contiene estos métodos y los etiquetó conACC_NATIVE
(0x0100
), y estos métodos no contienen el atributo Code , lo que significa que estos métodos no tienen ninguna lógica de codificación real en elRuntime.class
archivo:availableProcessors
: etiquetado como atributo nativo y sin códigofreeMemory
: etiquetado como atributo nativo y sin códigototalMemory
: etiquetado como atributo nativo y sin códigomaxMemory
: etiquetado como atributo nativo y sin códigogc
: etiquetado como atributo nativo y sin códigoDe hecho, la lógica de codificación está en el archivo Runtime.c correspondiente :
Y esta
C
codificación se compila en el archivolibjava.so
(Linux) olibjava.dll
(Windows), ubicado enJAVA_HOME/jmods/java.base.jmod/lib/libjava.so
:Referencia
fuente