Cuando una aplicaci�n Java pasa un string a un programa en lenguaje nativo, le pasa el string como del tipo jstring. Este tipo es muy diferente del tipo string normal del C (Char *). Si nuestro c�digo intenta imprimir directamente un jstring, resultar� en una caida de la VM (M�quina Virtual). Por ejemplo, el siguiente segmento de c�digo intenta imprimir incorrectamente un jstring y podr�a resultar en una ca�da de la m�quina virtual.
/* DO NOT USE jstring THIS WAY !!! */ JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt) { printf("%s", prompt);
Nuestro m�todo nativo debe utilizar las funciones JNI para convertir los strings Java en strings nativos. El JNI soporta la conversi�n desde y hacia strings nativos Unicode y UTF-8. En particular, los strings UFT-8 utilizan el bit m�s alto para se�alar caracteres multi-bytes; por lo tanto son compatibles con el ASCII de 7-bits. En Java, los strings UTF-8 siempre terminan en 0.
�Acceder a Strings Java
Nuestro m�todo nativo necesita llamar a GetStringUTFChars para imprimir correctamente el string pasado desde la aplicaci�n Java. GetStringUTFChars convierte la representaci�n interna Unicode de un String Java en un string UTF-8. Una vez seguros de que el string s�lo contiene caracteres ASCII de 7-bits, se puede pasar directamente a las funciones normales del C, como printf, como se vi� en Prompt.c.
JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt) { char buf[128]; const char *str = (*env)->GetStringUTFChars(env, prompt, 0); printf("%s", str); (*env)->ReleaseStringUTFChars(env, prompt, str);
Observa que cuanto nuestro m�todo nativo haya terminado de utilizar el string UFT-8, debe llamar a ReleaseStringUTFChars. ReleaseStringUTFChars informa a la VM que el m�todo nativo ha terminado con el string, para que pueda liberar la memoria utilizada por el string. Si no llamamos a ReleaseStringUTFChars se nos llenar� la memoria.
El m�todo nativo tambi�n puede construir un nuevo string utilizando la funci�n NewStringUTF del JNI. Las siguientes l�neas de c�digo de Java_Prompt_getLine muestran esto.
scanf("%s", buf); return (*env)->NewStringUTF(env, buf); }
�Utilizar el Puntero a Interface JNIEnv
Los m�todos nativos deben acceder y manipular los objetos Java, como los strings, a trav�s del puntero a interface env. En lenguaje C, esto requiere utilizar el puntero env para referenciar la funci�n JNI. Observa c�mo el m�todo nativo utiliza el puntero env para referenciar las dos funciones, GetStringUTFChars y ReleaseStringUTFChars. Adem�s, env se pasa como primer p�rametro a esas funciones.
�Otras Funciones JNI para Acceder a Strings Java
El JNI tambi�n proporcionar funciones para obtener la representaci�n Unicode de strings Java. Esto es muy �til, por ejemplo, en aquellos sistemas operativos que soportan Unicode como formato nativo. Tambi�n hay funciones �tiles para obtener la longitud de un String Java tanto en UTF-8 como en Unicode.
- GetStringChars toma el string Java y devuelve un puntero a un array de caracteres Unicode que contiene el string.
- ReleaseStringChars libera el puntero al array de caracteres Unicode.
- NewString construye un nuevo objeto java.lang.String desde un array de caracteres Unicode.
- GetStringLength devuelve la lngitud de un string que est� contenido en un array de caracteres Unicode.
- GetStringUTFLength devuelve la longitud de un strings si est� representado en el formato UTF-8.