Utilizar el Java Native Interface (JNI)

Esta p�gina ilustra c�mo declarar un m�todo nativo en el lenguaje Java y c�mo generar el correspondiente prototipo de funci�n en C/C++.

.�El Lado Java

Nuestro primer ejemplo, Prompt.java, contiene un m�todo nativo que acepta e imprime un String Java. El programa llama al m�todo nativo, que espera por una entrada del usuario y luego devuelve la l�nea que el usuario a tecelado.

La clase Java Prompt contiene un m�todo main que es utilizado para llamar al programa. Adem�s, existe un m�todo nativo getLine.

private native String getLine(String prompt);

Observa que las declaraciones para m�todos nativos son casi identicas a las declaraciones de m�todos normales de Java. Existen dos diferencias. Los m�todos nativos deben tener la palabra clave native. Esta palabra clave informa al compilador Java que la implementaci�n para este m�todo se proporciona en otro lenguaje. Tambi�n, la declaraci�n del m�todo nativo termina con un punto y coma, el s�mbolo de terminador de sentencia, porque no hay implementaciones para m�todos nativos en los ficheros de clases del lenguaje Java.

.�El Lado del Lenguaje Nativo

Se deben declarar e implementar los m�todos nativos en un lenguaje nativo, como C o C++. Antes de hacer esto, es �til generar un fichero de cabecera que contenga el prototipo de la funci�n para la implementaci�n del m�todo nativo.

Compilamos el fichero Prompt.java y luego generamos el fichero .h. Primeros compilamos el fichero Prompt.java de esta forma.

javac Prompt.java

Una vez compilado satisfactoriamente y habiendo creado el fichero Prompt.class, podemos crear un fichero de cabecera al stilo JNI, especificando una opci�n -jni a javah.

javah -jni Prompt

Examinamos el fichero Prompt.h. Observa el prototipo de funci�n para el m�todo nativo getLine que declaramos en Prompt.java.

JNIEXPORT jstring JNICALL 
Java_Prompt_getLine(JNIEnv *, jobject, jstring);

La definici�n de la funci�n del m�todo nativo en el c�digo de implementaci�n debe corresponder con el prototipo de funci�n generado en el fichero de cabecera. Siempre se debe incluir JNIEXPORT y JNICALL en los prototipos de funci�n para m�todos nativos. JNIEXPORT y JNICALL se aseguran de que el c�digo fuente se compilar� en plataformas como Win32 que requieren palabras claves especiales para funciones exportadas desde librer�as de enlace din�mico.

Los nombres de los m�todos nativos son una concatenaci�n de los siguientes componentes.

  • El prefijo Java_
  • El nombre de la clase totalmente cualificado
  • Un subrayado "_" separador
  • el nombre del m�todo

(Observa que los nombres de los m�todos nativos sobrecargados, adem�s de los componentes anteriores, tienen un doble subrayado "__" a�adido al nombre del m�todo y seguido por la firma de argumentos).

As�, la implementaci�n en c�digo nativo para el m�todo Prompt.getLine se convierte en Java_Prompt_getLine. (No existe nombre de paquete, porque la clase Prompt est� en el paquete por defecto).

Cada m�todo nativo tiene dos par�metros adem�s de los que pongamos en la declaraci�n en lenguaje Java. El primer par�metro, JNIEnv *, es el puntero al interface JNI. Este puntero a interface est� organizado como una tabla de funciones, donde cada funci�n JNI tiene un punto de entrada conocido en la tabla. Nuestros m�todos nativos llaman a funciones espec�ficas del JNI para acceder a objetos Java a trav�s del puntero JNIEnv *. El par�metro jobject es una referencia al propio objeto (es como el puntero this en C++).

Y por �ltimo, observa que el JNI tiene un conjunto de tipos de nombres, como jobject y jstring, y cada tipo corresponde con un tipo del lenguaje Java. Todos esto se cubre en la p�gina siguiente.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO