¿Para qué es la palabra clave nativa en Java?

Mientras jugaba este rompecabezas (es un juego de palabras clave de Java), me encontré con la palabra clave native .

¿Para qué se utiliza la palabra clave native en Java?

La palabra clave native se aplica a un método para indicar que el método se implementa en código nativo utilizando JNI (Java Native Interface).

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 utilizaron en el pasado para escribir secciones de rendimiento crítico, pero con Java cada vez más rápido, ahora es menos común. Los métodos nativos son necesarios actualmente cuando

  • Debe llamar a una biblioteca de Java escrita en otro idioma.

  • Necesita acceder a los recursos del sistema o del hardware que solo son accesibles desde el otro idioma (generalmente C). En realidad, muchas funciones del sistema que interactúan con la computadora real (disco y red IO, por ejemplo) solo pueden hacer esto porque llaman al código nativo.

Consulte también Especificación de la interfaz nativa de Java

Ejemplo mínimo para aclarar las cosas:

Main.java :

 public class Main { public native int square(int i); public static void main(String[] args) { System.loadLibrary("Main"); System.out.println(new Main().square(2)); } } 

Main.c :

 #include  #include "Main.h" JNIEXPORT jint JNICALL Java_Main_square( JNIEnv *env, jobject obj, jint i) { return i * i; } 

Comstackr y ejecutar :

 sudo apt-get install build-essential openjdk-7-jdk export JAVA_HOME='/usr/lib/jvm/java-7-openjdk-amd64' 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 

Salida :

 4 

Probado en Ubuntu 14.04 AMD64. También trabajé con Oracle JDK 1.8.0_45.

Ejemplo en GitHub para que juegues.

Los subrayados en los nombres de paquete / archivo Java se deben escapar con _1 en el nombre de la función C como se menciona en: Invocar funciones JNI en el nombre del paquete de Android que contiene subrayado

Interpretación :

Te permite:

  • llamar a una biblioteca cargada dinámicamente comstackda (aquí escrita en C) con código de ensamblaje arbitrario de Java
  • y obtener resultados de nuevo en Java

Esto podría ser utilizado para:

  • escriba un código más rápido en una sección crítica con mejores instrucciones de ensamblaje de la CPU (no portátil)
  • hacer llamadas directas al sistema (no es portátil)

con la compensación de una menor portabilidad.

También es posible llamar a Java desde C, pero primero debe crear una JVM en C: ¿Cómo llamar a las funciones de Java desde C ++?

Android NDK

El concepto es exactamente el mismo en este contexto, excepto que debe usar el texto repetitivo de Android para configurarlo.

El repository oficial de NDK contiene ejemplos “canónicos” como la aplicación hello-jni:

Al unzip una .apk con NDK en Android O, puede ver el lib/arm64-v8a/libnative-lib.so precomstackdo que corresponde al código nativo en lib/arm64-v8a/libnative-lib.so .

TODO confirmar: además, el file /data/app/com.android.appname-*/oat/arm64/base.odex , dice que es una biblioteca compartida, que creo que es el AOT precomstackdo .dex correspondiente a los archivos Java en ART , mira también: ¿Qué son los archivos ODEX en Android? Entonces, ¿quizás el Java también se ejecuta a través de una interfaz native ?

Ejemplo en OpenJDK 8

Busquemos encontrar dónde se define Object#clone en jdk8u60-b27.

Concluiremos que se implementa con una llamada native .

Primero encontramos:

 find . -name Object.java 

lo que nos lleva a jdk / src / share / classes / java / lang / Object.java # l212 :

 protected native Object clone() throws CloneNotSupportedException; 

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:

 find . -iname object.c 

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 :

 static JNINativeMethod methods[] = { ... {"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone}, }; JNIEXPORT void JNICALL Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls) { (*env)->RegisterNatives(env, cls, methods, sizeof(methods)/sizeof(methods[0])); } 

que nos lleva al símbolo JVM_Clone :

 grep -R JVM_Clone 

lo que nos lleva a hotspot / src / share / vm / prims / jvm.cpp # l580 :

 JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle)) JVMWrapper("JVM_Clone"); 

Después de expandir un montón de macros, llegamos a la conclusión de que este es el punto de definición.

Directamente de la especificación de lenguaje Java :

Un método native se implementa en un código dependiente de la plataforma, normalmente escrito en otro lenguaje de progtwigción como C, C ++, FORTRAN o lenguaje ensamblador. El cuerpo de un método native se proporciona solo como un punto y coma, lo que indica que la implementación se omite, en lugar de un bloque.

Como respondió SLaks, la palabra clave native es para llamar al código nativo.

También lo usó GWT para implementar métodos de JavaScript.

las funciones que implementan el código nativo se declaran nativas.

La interfaz nativa de Java (JNI) es un marco de progtwigción que permite que el código Java que se ejecuta en una máquina virtual Java (JVM) llame y llame a las aplicaciones nativas (progtwigs específicos de un hardware y la plataforma del sistema operativo) y bibliotecas escritas en otros lenguajes como C, C ++ y ensamblaje.

http://en.wikipedia.org/wiki/Java_Native_Interface

NATIVE es el modificador Non Access. Se puede aplicar solo a METHOD. Indica la implementación de método o código DEPENDIENTE DE LA PLATAFORMA.

native es una palabra clave en java, que se utiliza para hacer que la estructura no implementada (método) sea como abstracta, pero sería una plataforma dependiente, como el código nativo, y se ejecutaría desde la stack nativa, no desde la stack Java.

  • native es una palabra clave en java, indica plataforma dependiente.
  • native métodos native son actos como la interfaz entre Java ( JNI ) y otros lenguajes de progtwigción.

La palabra clave native se aplica a un método para indicar que el método se implementa en código nativo utilizando JNI (Java Native Interface) . native es un modificador aplicable solo para métodos y no podemos aplicarlo en ningún otro lado . Los métodos que se implementan en C, C ++ se llaman métodos nativos o métodos foráneos.

El objective principal de la palabra clave nativa es:

  • Para mejorar el rendimiento del sistema.
  • Para lograr la comunicación a nivel de misión / nivel de memoria.
  • Para usar un código heredado no java ya existente.

La palabra clave native se usa para declarar un método que se implementa en un código dependiente de la plataforma, como C o C ++. Cuando un método se marca como nativo, no puede tener un cuerpo y debe terminar con un punto y coma en su lugar. La especificación Java Native Interface (JNI) rige las reglas y directrices para la implementación de métodos nativos, como la conversión de tipos de datos entre Java y la aplicación nativa.

El siguiente ejemplo muestra una clase con un método declarado como nativo:

 public class NativeExample { public native void fastCopyFile(String sourceFile, String destFile); }