Android JNI开发(4)--访问Java的实例变量和静态变量

来源:互联网 发布:在淘宝刷好评犯法吗 编辑:程序博客网 时间:2024/06/05 03:26

啥都不说了,上代码:

/*  * 访问Java实例变量的值 */  JNIEXPORT void accessInstanceField (JNIEnv *env, jclass cls, jobject obj)  {      jclass clazz;      jfieldID fid;      jstring j_str;      jstring j_newStr;      const char *c_str = NULL;      // 1.获取AccessField类的Class引用      clazz = (*env)->GetObjectClass(env,obj);      if (clazz == NULL) {          return;      }      // 2. 获取AccessField类实例变量名为str的属性ID ,类型为String类型     fid = (*env)->GetFieldID(env,clazz,"str", "Ljava/lang/String;");      if (clazz == NULL) {          return;      }      // 3. 获取实例变量str的值      j_str = (jstring)(*env)->GetObjectField(env,obj,fid);      // 4. 将unicode编码的java字符串转换成C风格字符串      c_str = (*env)->GetStringUTFChars(env,j_str,NULL);      if (c_str == NULL) {          return;      }      printf("In C--->ClassField.str = %s\n", c_str);      (*env)->ReleaseStringUTFChars(env, j_str, c_str);      // 5. 修改实例变量str的值      j_newStr = (*env)->NewStringUTF(env, "This is C String");      if (j_newStr == NULL) {          return;      }      (*env)->SetObjectField(env, obj, fid, j_newStr);      // 6.删除局部引用      (*env)->DeleteLocalRef(env, clazz);      (*env)->DeleteLocalRef(env, j_str);      (*env)->DeleteLocalRef(env, j_newStr);  }  /*  * Class:     com_study_jnilearn_AccessField  * Method:    accessStaticField  * Signature: ()V  */  JNIEXPORT void JNICALL Java_com_study_jnilearn_AccessField_accessStaticField  (JNIEnv *env, jclass cls)  {      jclass clazz;      jfieldID fid;      jint num;      //1.获取ClassField类的Class引用      clazz = (*env)->FindClass(env,"com/xxxx/ClassField");      if (clazz == NULL) {    // 错误处理          return;      }      //2.获取ClassField类静态变量num的属性ID      fid = (*env)->GetStaticFieldID(env, clazz, "num", "I");      if (fid == NULL) {          return;      }      // 3.获取静态变量num的值      num = (*env)->GetStaticIntField(env,clazz,fid);      printf("In C--->ClassField.num = %d\n", num);      // 4.修改静态变量num的值      (*env)->SetStaticIntField(env, clazz, fid, 80);      // 删除属部引用      (*env)->DeleteLocalRef(env,clazz);  }  
阅读全文
0 0
原创粉丝点击