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.