.java File:
class InstanceFieldAccess{
private String s;
private native void accessField();
public static void main(String args[]){
InstanceFieldAccess c = new InstanceFieldAccess();
c.s = "abc";
c.accessField();
System.out.println("In Java: ");
System.out.println(" c.s = \""+ c.s + "\"");
}
static{
System.loadLibrary("InstanceFieldAccess");
}
}
.c File:
#include <jni.h>
#include <stdio.h>
#include "InstanceFieldAccess.h"
JNIEXPORT void JNICALL Java_InstanceFieldAccess_accessField
(JNIEnv *env, jobject obj){
jfieldID fid;
jstring jstr;
const char *str;
/* Get a reference to obj's class */
jclass cls = (*env)->GetObjectClass(env, obj);
printf("In c:\n");
/* Look for the instance field s in cls */
fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");
if (fid == NULL){
return;
}
/* Read the instance field s */
jstr = (*env)->GetObjectField(env, obj, fid);
str = (*env)->GetStringUTFChars(env, jstr, NULL);
if (str == NULL){
return;
}
printf(" c.s = \"%s\"\n",str);
(*env)->ReleaseStringUTFChars(env,jstr,str);
/* Create a new String overwrite the instance field */
jstr = (*env)->NewStringUTF(env,"123");
if (jstr == NULL){
return;
}
(*env)->SetObjectField(env, obj, fid, jstr);
}
Procedure for Accessing an Instance Field
1. Get field id : obtain the field ID form the class reference, field name and field descriptor.
//To get field ID from the following things.
// 1. class type.
// 2. field name.
// 3. field descriptor.
jfieldID fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");
2. Get field value from Object and field ID.
//To get field value from the following things.
//1. Object
//2. field ID.
jstring jstr = (*env)->GetObjectField(env, obj, fid);
3. Set field value form Object, field ID and value.
(*env)->SetObjectField(env, obj, fid, jstr);
Other functions:
GetIntField
SetFloatField