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.
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;");
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);
"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;
...