El JNI proporciona funciones que los m�todos nativos utilizan para obtener y seleccionar campos Java. Se pueden obtener y seleccionar tanto campos de ejemplar como campos de clase (est�ticos). Similarmente al acceso a los m�todos, se utiliza un conjunto de funciones JNI para acceder a campos de ejemplar y otro conjunto para acceder a campos est�ticos.
Nuestro programa de ejemplo, FieldAccess.java, contiene una clase con un campo Integer est�tico si y un campo String de ejemplar s. El programa de ejemplo llama al m�todo nativo accessFields, que imprime los valores de esos dos campos y modifica esos valores. Para verificar que se han modificado realmente los valores de los campos, imprimimos de nuevo sus valores desde la aplicaci�n Java despu�s de que haya retornado el m�todo nativo.
�Procedimiento para Acceder a Campos Java
Para obtener y seleccionar campos Java desde un m�todo nativo, se debe hacer lo siguiente.
- Obtener el idendificador para ese campo dentro de su clase, el nombre y el tipo de firma, Por ejemplo, en FieldAccess.c, obtenemos el identificador para el campo est�tico entero si de esta forma.
fid = (*env)->GetStaticFieldID(env, cls, "si", "I");
y obtenemos el identificador para el campo string de ejemplar s, de esta forma.
fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");
- Utilizar una de las varias funciones JNI para obtener o modificar el campo especificado por el identificador del campo. Para obtener el valor del campo, se pasa la clase a una de las funciones de acceso a campos apropiada. Por ejemplo, en FieldAccess.c, utilizamos GetStaticIntField para obtener el valor del campo est�tico Intenger si, de esta forma.
si = (*env)->GetStaticIntField(env, cls, fid);
Utilizamos la funci�n GetObjectField para obtener el valor del campo de ejemplar String s.
jstr = (*env)->GetObjectField(env, obj, fid);
Igual que hicimos cuando llamamos a un m�todo Java, dividimos el costo de la b�squeda del campo utilizando un proceso de dos pasos. Primero obtenemos el ID del campo, luego utilizamos el ID del campo para acceder al propio campo. El ID de campo s�lo identifica a un campo en una clase dada. Igualmente que los IDs de m�todo, un ID de campo permanece v�lido hasta que la clase de la que se ha derivado es descargada.
�Firmas de Campos
Las firmas de campo se especifican siguiendo el mismo esquema de codificaci�n que las firmas de m�todos. La forma general de una firma de campo es.
"tipo_de_campo"
La firma del campo es un s�mbolo codificado para el tipo del campo, encerrado entre comillas (""). Los s�mbolos de campos son los mismos que los s�mbolos de los argumentos en la firma de m�todos. Esto es, un campo Integer se representa con "I", un campo float se representa con "F", un campo double "D" y un campo booleano con "Z", etc.
La firma para un objeto Java, como un String, empieza con la letra L, seguida por la clase totalmente cualificada del objeto, y terminada con un punto y coma (;). As�, se formar�a la firma un campo String, como c.s en FieldAccess.java, de esta forma.
"Ljava/lang/String;"
Los arrays se indican con un corchete abierto ([) seguido por el tipo del array. Por ejemplo, se designar�a un array de Integer de esta forma.
"[I"
Puedes referirte a la tabla de la p�gina anterior que sumariza la codificaci�n para las firmas Java y sus correspondientes tipos.
Se puede utilizar javap con la opci�n "-s" para generar firmas de campos de una clase. Por ejemplo, si se ejecuta.
javap -s -p FieldAccess
Este da una salida que contiene las siguientes firmas de campos.
... static si I s Ljava/lang/String; ...