Visión general de la interfaz JNI
Desde el punto de vista de una JVM, hay dos tipos de código: "Java™" y "native". La interfaz nativa Java (JNI) establece una interfaz bien definida e independiente de la plataforma entre los dos.
El código nativo se puede utilizar junto con Java de dos maneras distintas: como "métodos nativos" en una JVM en ejecución y como el código que crea una JVM utilizando la "API de invocación". En este apartado se describe la diferencia.
Métodos nativos
Los métodos nativos Java se declaran en Java, se implementan en otro lenguaje (como C o C++) y la JVM los carga según sea necesario. Para utilizar métodos nativos, debe:
- Declare el método nativo en el código Java.
Cuando el compilador javac encuentra una declaración de método nativo en el código fuente Java, registra el nombre y los parámetros del método. Puesto que el código fuente Java no contiene ninguna implementación, el compilador marca el método como "nativo". A continuación, la máquina virtual Java (JVM) puede resolver el método correctamente cuando se invoca.
- Implementar el método nativo.
Los métodos nativos se implementan como puntos de entrada en una biblioteca binaria cargable. El contenido de una biblioteca nativa es específico de la plataforma. JNI proporciona un modo de que la JVM utilice cualquier método nativo de una forma que es independiente de la plataforma.
JVM realiza llamadas a los métodos nativos. Cuando la JVM está en un método nativo, JNI proporciona un modo de"devolver la llamada" a JVM.
- Cargar el código del método nativo para que la máquina virtual lo utilice.
Además de declarar el método nativo, debe encontrar y cargar la biblioteca nativa que contiene el método en tiempo de ejecución.
Dos interfaces Java cargan bibliotecas nativas:
- java.lang.System.load()
- java.lang.System.loadLibrary()
Normalmente, una clase que declara métodos nativos carga la biblioteca nativa en el inicializador estático.
API de invocación
En la creación de una JVM hay código nativo. El aspecto de la interfaz JNI utilizada para este fin se denomina API de invocación JNI. Para utilizar la API de invocación, debe enlazarse a una biblioteca compartida específica de la implementación, bien sea de forma estática o dinámica y debe llamar a las funciones JNI_* que exporta.
Especificación e implementación JNI
La especificación JNI es ambigua en cuanto a los detalles de implementación seleccionados. Proporciona una infraestructura reutilizable para interfaces nativas C y C++ simples y extensibles. El modelo JNI también es la base para la especificación JVMTI.
La especificación de marca registrada de Oracle Corporation y Java Compatibility Kit (JCK) garantizan la conformidad con la especificación, pero no con la implementación. El código nativo debe cumplir la especificación y no la implementación. El código escrito con un comportamiento sin especificar es propenso a tener problemas de portabilidad y compatibilidad con versiones posteriores.