在JNI中访问Java对象的属性,通常需要先获取属性的jfieldID
,然后使用相应的函数进行读写操作。
1、访问非静态属性
例1:
//Java代码
public class MyClass {private int mValue;public MyClass(int value) {mValue = value;} }
#include <jni.h> #include <iostream>// 假设JNIEnv* env和jobject obj已经被正确设置// 1. 加载Java类 jclass clazz = env->FindClass("com/example/MyClass");// 2. 获取属性的jfieldID jfieldID fieldID = env->GetFieldID(clazz, "mValue", "I");// 3. 读取属性值 jint value = env->GetIntField(obj, fieldID); std::cout << "Read value: " << value << std::endl;// 4. 设置属性值 jint newValue = value + 1; env->SetIntField(obj, fieldID, newValue); std::cout << "New value set: " << newValue << std::endl;// 5. 释放本地引用 env->DeleteLocalRef(clazz);
例2:
//Java代码
public String key = "key"; public native String accessField();
JNIEXPORT jstring JNICALL Java_JniMain_accessField(JNIEnv * env, jobject jobj)
{//1.获取jclasssjclass jclz = (*env)->GetObjectClass(env,jobj);//2.fieldId key:属性名称, Ljava/lang/String:属性签名jfieldID fid = (*env)->GetFieldID(env,jclz,"key","Ljava/lang/String;");//3.得到key 对应的值//GetXXXField 因为String 是引用类型 所以使用GetObjectFieldjstring jstr = (*env)->GetObjectField(env,jobj,fid);//4.将jni的string 转换成C的charchar * c_str = (*env)->GetStringUTFChars(env,jstr,NULL);//5.生成新的字符串 HBin keychar text[30] = "HBin";stract(text,c_str);//6.C->jnijstring new_str = (*env)->NewStringUTF(env,text);//7.使用set方法(env)-SetObjectField(env,jobj,fid,new_str);//释放(*env)->ReleaseStringChars(env,new_str,c_str);return new_str; }
2、访问静态属性
例1:
//Java代码 public static int count = 9; public native void accessStaticField();
//访问静态域还是使用jobject的参数 范围静态函数才是使用jclass的参数 JNIEXPORT void JNICALL Java_JniMain_accessStaticField(JNIEnv * env, jobject jobj) {//1.获取jclasssjclass jclz = (*env)->GetObjectClass(env, jobj);//2.得到fieldId count:属性名称, I:属性签名jfieldID fid = (*env)->GetFieldID(env, jclz, "count", "I");jint count = (*env)->GetStaticIntField(env, jclz, fid);//int 不需要转换可以直接使用count++;(env)->SetStaticIntField(env, jclass, fid, count);}