Interface de Programación Nativo de Java

El JDK 1.1 soporta el Interface Nativo Java (JNI). Por un lado, el JNI define un estándard de nombres y convenciones de llamadas para que la Máquina Virtual Java (VM) pueda encontrar nuestros métodos nativos. Por otro lado, el JNI ofrece un conjunto de funciones de interface estándard. Se puede llamar a las funciones JNI desde nuestros métodos nativos para hacer cosas como acceder y manipular objetos Java, liberar objetos Java, crear nuevos objetos, llamar a métodos Java, etc.

Esta sección muestra cómo seguir las convenciones de nombres y de llamadas del JNI, y como utilizar las funciones del JNI desde un método nativo. Cada ejemplo consiste en un programa escrito en Java que llama a varios métodos nativos implementados en C. Los métodos nativos, a su vez, podrían llamar a las funciones JNI para acceder a los objetos Java.

La sección también muestra cómo incluir la máquina virtual Java dentro de una aplicación nativa.

Declarar Métodos Nativos

En el lado del lenguaje Java, se declara un método nativo con la palabra clave native y un cuerpo de método vacío. En el lado del lenguaje nativo, se proporciona la implementación del método nativo. Debemos tener cuidado cuando escribamos métodos nativos que "corresponda" la implementación de la función nativa con la firma del método en el fichero de cabecera del lenguaje Java. La herramienta javah, que se explicó en el Paso 3: Crear el fichero .h, nos ayuda a generar prototipos de funciones nativas que corresponden con la declaración del método nativo en lenguaje Java.

Mapear entre Tipos Java y Tipos Nativos

El JNI define un mapeado de los tipos del lenguaje Java y los tipos de lenguaje nativo (C/C++). Esta página presenta los tipos nativos correspondientes tanto a los tipos primitivos Java como int y double, y los objetos del lenguaje Java, incluyendo strings y arrays.

Acceder a Strings Java

Los Strings son un tipo de objeto Java particularmente útil. El JNI proporciona un conjunto de funciones para manipulación de Strings que hace sencilla la terea manejar objetos Strings de Java en el código nativo. El programador puede traducir entre Strings Java y Strings nativos en los formatos Unicode y UTF-8.

Acceder a Arrays Java

Los Arrays son otro tipo de objetos Java muy utilizados. Se pueden utilizar las funciones de manipulación de arrays del JNI para crear y acceder a los elementos de un array.

Llamar a Métodos Java

El JNI soporta un completo conjunto de operaciones de llamada que permiten invocar métodos Java desde código nativo. Se localiza el método utilizando su nombre y su firma. Se pueden llamar tanto a métodos estáticos como a métodos de ejemplar (no estáticos). Se puede utilizar la herramienta javap para generar firmas de métodos al estilo JNI para los ficheros de clases.

Acceder a Campos Java

El JNI permite localizar un campo Java utilizando el nombre y la firma del campo. Se pueden localizar y acceder tanto a campos estáticos como campos de ejemplar (no estáticos). Se puede utilizar la herramienta javap para generar firmas de campos al estilo JNI para los ficheros de clases.

Capturar y Lanzar Excepciones

Esta sección enseña como tratar con excepciones dentro de una implementación de método nativo. Nuestros métodos nativos pueden capturar, lanzar y borrar excepciones.

Refeencias Locales y Globales

El código nativo se puede referir a objetos Java utilizando referencias locales o globales. Las referencias locales son sólo válidas dentro de una llamada a método nativo. Son liberadas automáticamente después de que retorne el método nativo. Las referencias globales deben asignarse y liberarse explícitamente.

Threads y Métodos Nativos

Esta página describe la implicación de ejecutar métodos nativos en un entorno multi-thread. El JNI ofrece constructores de sincronización básicos para métodos nativos.

Llamar a la Máquina Virtual Java

Esta sección enseña cómo cargar la Máquina Virtual Java desde una librería nativa en una aplicación nativa. Incluye instrucciones de cómo inicializar la Máquina Virtual Java e invocar métodos Java. El API "Invocation" también permite añadir threads nativos a una Máquina Virtual Java que ya está ejecutándose y convertirse ellos mismos en threads Java. Actualmente, el JDK sólo soporta la adición de threads nativos en Win32. El soporte para threads nativos en Solaris estará disponible en una futura versión.

Programación JNI en C++

En el lenguaje C++, el JNI presenta un interface mucho más claro y realiza chequeos de tipos estáticos adicionales.

Ozito