2011-05-23 13 views
360

Mientras jugaba this puzzle (Es un juego de palabras clave de Java), me encontré con la palabra clave native.¿Para qué es la palabra clave nativa en Java?

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

+10

Vea también [Qué es la implementación nativa en Java] (http://stackoverflow.com/q/557574/122607), [Uso de nativo en Java] (http://stackoverflow.com/q/2902618/122607) y [¿Qué hace la palabra clave native?] (Http://stackoverflow.com/q/3598315/122607). – Pops

Respuesta

259

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).

+127

Ignotum por ignotius :-) – MaxZoom

+35

Latín por "lo desconocido por lo desconocido". Guardar buscando – iantonuk

+19

^Este comentario ejemplifica el término. Ignotum per ignotius es cuando alguien ofrece una explicación que es más difícil de entender que la que se supone debe explicar. – AndrewF

18

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

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

329

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, esto es ahora menos común. Los métodos nativos son necesarios actualmente cuando

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

  • Necesita acceder a los recursos del sistema o del hardware que solo son accesibles desde el otro idioma (normalmente 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.

Ver también Java Native Interface Specification

+3

Tengo entendido que escribo System.currentTimeMillis() (que es nativo) en un archivo java y luego esto funciona, JNI llamará a las bibliotecas o a algunas funciones escritas en C o C++ o lenguaje ensamblador y luego devolver algún valor a mi código java. ex: aquí el método currentTimeMillis invoca un código nativo con la ayuda de JNI y ese código nativo habla con recursos del sistema ex: un temporizador que se encuentra en la placa base y, por lo tanto, obtiene un valor de retorno (tiempo del sistema). corrígeme, por favor? – MKod

+3

@MKod métodos como 'currentTimeMillis' son parte del JDK y están anotados con' native' porque la implementación está en el código fuente de JDK.Es muy poco probable que la implementación use lenguaje ensamblador; probablemente invoque un método API del sistema operativo sobre el que se ejecuta la JVM. Por ejemplo, en Windows puede llamar a un método DLL 'GetSystemTime' en kernel32.dll. En otro sistema operativo, tendrá una implementación diferente. Sin embargo, cuando usa 'native' para un método que está escribiendo (a diferencia de un método JDK), debe proporcionar la implementación usando JNI. – Kidburla

+0

Esta afirmación es importante para la palabra clave nativa ... 'Debe acceder a los recursos del sistema o del hardware que solo son accesibles desde el otro idioma (generalmente C)'. – atiqkhaled

52

Directamente desde the Java Language Specification:

un método que es native se implementa en código dependiente de la plataforma, por lo general escrito en otro lenguaje de programació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.

13

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

El Java Native Interface (JNI) es un marco de programación que permite que el código Java que se ejecuta en una máquina virtual de Java (JVM) para llamar y ser llamado por, aplicaciones nativas (programas específicos de un hardware y sistema operativo plataforma) y bibliotecas escritas en otros lenguajes como C, C++ y ensamblaje.

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

6

nativa es una palabra clave en Java, que se utiliza para hacer que la estructura no se han aplicado (método) como lo abstracto, sino que sería una plataforma dependientes tales como código nativo y ejecutar de no pila nativa pila de Java .

6

NATIVE no es un modificador de acceso.se puede aplicar solo al MÉTODO. Indica la implementación PLATAFORMA DEPENDIENTE del método o código.

290

ejemplo Mínimo para hacer las cosas más claras:

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 <jni.h> 
#include "Main.h" 

JNIEXPORT jint JNICALL Java_Main_square(
    JNIEnv *env, jobject obj, jint i) { 
    return i * i; 
} 

compilar 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.

Example on GitHub para que juegues con.

subrayado en Java nombres de paquete/archivo debe ser escapado con _1 en el nombre de la función C como se ha mencionado en: Invoking JNI functions in Android package name containing underscore

Interpretación:

Se le permite:

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

Esto podría ser usado para:

  • escribir código más rápido en una sección crítica con instrucciones de montaje mejor CPU (no portátiles CPU)
  • realizar llamadas de sistema directo (no OS portátil)

con la compensación de una menor portabilidad.

También es posible que usted pueda llamar a Java desde C, pero primero debe crear una JVM en C: How to call Java functions from C++?

Android NDK

El concepto es exactamente el mismo en este contexto, a excepción que tienes que usar un texto repetitivo de Android para configurarlo.

El repositorio oficial NDK contiene ejemplos "canónicos", tales como la aplicación hello-JNI:

En que unzip un .apk con NDK de Android O, se puede ver el .so precompilado que corresponde al código nativo bajo lib/arm64-v8a/libnative-lib.so.

TODO confirman: por otra parte, file /data/app/com.android.appname-*/oat/arm64/base.odex, dice que es una biblioteca compartida, que creo que es la AOT precompilado .dex correspondiente a los archivos de Java en el arte, ver también: What are ODEX files in Android? Así que tal vez el Java es en realidad también se ejecuta a través de un native ¿interfaz?

Ejemplo en el OpenJDK 8

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

Concluiremos que está implementado con una llamada native.

En primer lugar nos encontramos con:

find . -name Object.java 

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 clon es en medio de toda la vía indirecta. La consulta que me ayudó fue:

find . -iname object.c 

que encontrar archivos C o C++ que podrían poner en práctica los métodos nativos del objeto. 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 

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 grupo de macros, llegamos a la conclusión de que este es el punto de definición.

+39

Las respuestas como la suya son la razón por la que amo y uso StackOverflow continuamente. Sería increíble si pudieras votar para fusionar una respuesta (s) con la respuesta aceptada, o de alguna manera marcar dos respuestas como aceptadas. –

+3

@JonnyHenly gracias! La fusión sería interesante, pero como tenemos votos ascendentes, es difícil distribuir representantes, y tal vez no importe tanto. Lo que probablemente veamos algún día es: http://meta.stackexchange.com/questions/15805/how-can-we-make-good-onswers-to-old-questions-float-to-the-top –

+3

Es Siempre es bueno ver las respuestas con un código de muestra detallado. –

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

La palabra clave native se utiliza para declarar un método que se implementa en 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 orígenes:

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

El nativ e palabra clave se utiliza para declarar un método que se implementa en código dependiente de la plataforma tales 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); 

} 

Desventajas de los métodos nativos:

  • Los métodos nativos se almacenan con .DLL (biblioteca de vínculos dinámicos) extensiones de archivo en Windows. Los archivos DLL dependen de la máquina. Por lo tanto, los métodos nativos no son portátiles.

  • Dado que los métodos nativos usan códigos de máquina, pueden surgir serios problemas de seguridad.

1

La palabra clave nativa se aplica a un método para indica que el método se implementa en código nativo utilizando JNI (Java Native Interface). native es un modificador aplicable solo para los 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 objetivo principal de la palabra clave native son:

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