以native层访问修改Java层对象中的string数据为例介绍:
1.获得object对应的类对象
jclass cls = (*env)->GetObjectClass(env, obj);
2.从类对象中获得对象中数据的ID
fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;")
"s":参数名字
"Ljava/lang/String;":参数描述
3.获得对象中数据在虚拟机中的地址
jstr = (*env)->GetObjectField(env, obj, fid);
4.转为底层可以访问的数据
str = (*env)->GetStringUTFChars(env, jstr, NULL);
5.修改数据
jstr = (*env)->NewStringUTF(env, "123");
(*env)->SetObjectField(env, obj, fid, jstr);
具体实例如下
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");
}
}
JNIEXPORT void JNICALL
Java_InstanceFieldAccess_accessField(JNIEnv *env, jobject obj)
{
jfieldID fid; /* store the field ID */
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; /* failed to find the field */
}
/* Read the instance field s */
jstr = (*env)->GetObjectField(env, obj, fid);
str = (*env)->GetStringUTFChars(env, jstr, NULL);
if (str == NULL) {
return; /* out of memory */
}
printf(" c.s = \"%s\"\n", str);
(*env)->ReleaseStringUTFChars(env, jstr, str);
/* Create a new string and overwrite the instance field */
jstr = (*env)->NewStringUTF(env, "123");
if (jstr == NULL) {
return; /* out of memory */
}
(*env)->SetObjectField(env, obj, fid, jstr);
}
输出
In C: c.s = "abc" In Java: c.s = "123"