Java 中的实例变量和静态变量,在本地代码中如何来访问和修改。静态变量也称为类变量(属性),在全部实例对象中共享同一份数据,能够直接经过类名.变量名来访问。实例变量也称为成员变量(属性),每一个实例都拥有一份实例变量数据的拷贝,它们之间修改后的数据互不影响。java
直接上代码:android
public class Person { //成员变量 private String hobby; //静态变量 private static int happiness; public String getHobby() { return hobby; } public static int getHappiness() { return happiness; } //Native方法中设置成员变量的值 public native boolean setHobby(); //Native方法中设置静态变量的值 public native boolean setHappiness(); }
JNIEXPORT jboolean JNICALL Java_org_professor_jni_bean_Person_setHobby(JNIEnv *env, jobject instance) { //1.获取类类型的Class对象 jclass personClass = (*env)->FindClass(env, "org/professor/jni/Person"); if (NULL == personClass) { __android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND CLASS"); return JNI_FALSE; } //2.获取属性ID jfieldID hobbyFiledID = (*env)->GetFieldID(env, personClass, "hobby", "Ljava/long/String"); if (NULL == hobbyFiledID) { __android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND Hobby FiledID"); return JNI_FALSE; } //3.实例属性,经过对象获取属性值 jstring hobbyFiledStr = (*env)->GetObjectField(env, instance, hobbyFiledID); if (NULL != hobbyFiledStr) { const char *hobby = (*env)->GetStringUTFChars(env, hobbyFiledStr, NULL); if (NULL != hobby) { __android_log_print(ANDROID_LOG_ERROR, "PERSON Hobby", hobby); (*env)->ReleaseStringChars(env, hobbyFiledStr, hobby); } } //4.设置属性值 jstring jHobby = (*env)->NewStringUTF(env, "BASKETBALL,RUN"); (*env)->SetObjectField(env, instance, hobbyFiledID, jHobby); //5.删除局部引用变量 (*env)->DeleteLocalRef(env, personClass); (*env)->DeleteLocalRef(env, hobbyFiledStr); (*env)->DeleteLocalRef(env, jHobby); return JNI_TRUE; } JNIEXPORT jboolean JNICALL Java_org_professor_jni_bean_Person_setHappiness(JNIEnv *env, jobject instance) { //1.获取类类型的Class对象 jclass personClass = (*env)->FindClass(env, "org/professor/jni/Person"); if (NULL == personClass) { __android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND CLASS"); return JNI_FALSE; } //2.获取属性ID jfieldID happinessFiledID = (*env)->GetStaticFieldID(env, personClass, "happiness", "I"); if (NULL == happinessFiledID) { __android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND Happiness FiledID"); return JNI_FALSE; } //3.获取静态属性值 jint happinessValue = (*env)->GetStaticIntField(env, personClass, happinessFiledID); if (NULL != happinessValue) { __android_log_print(ANDROID_LOG_ERROR, "PERSON happinessValue = %d", (const char *) happinessValue); } //4.设置静态属性值 (*env)->SetStaticIntField(env, personClass, happinessFiledID, 80); //5.删除本地局部引用表,基本数据类型不须要 (*env)->DeleteLocalRef(env, personClass); return JNI_TRUE; }
GetObjectClass
函数获取实例对象的 Class 引用GetFieldID
函数获取 Class 引用中某个实例变量的 IDGetXXXField
函数获取变量的值,须要传入实例变量所属对象和变量 IDSetXXXField
函数修改变量的值,须要传入实例变量所属对象、变量 ID 和变量的值FindClass
函数获取类的 Class 引用GetStaticFieldID
函数获取 Class 引用中某个静态变量 IDGetStaticXXXField
函数获取静态变量的值,须要传入变量所属 Class 的引用和变量 IDSetStaticXXXField
函数设置静态变量的值,须要传入变量所属 Class 的引用、变量 ID和变量的值