1、步骤 :
(1)、获取 jclass
(2)、获取 类属性字段的id(最后一个参数是 属性字段 的签名)
(3)、获取/设置 类属性字段的值
ZC: 貌似 JNI里面 操作 类属性字段,完全是 无视 访问权限的... 然而 static的类属性字段,稍有不同,要注意。
2、VC6(CPP)的DLL代码:
#include<stdio.h> #include "jniZ_TjniField.h" JNIEXPORT void JNICALL Java_jniZ_TjniField_NativeFunc(JNIEnv * env, jobject obj) { // 获取obj中对象的class对象 jclass clazz = env->GetObjectClass(obj); // 获取 类属性字段的id(最后一个参数是 属性字段 的签名) jfieldID fieldidFi = env->GetFieldID(clazz, "Fi", "I"); // public jfieldID fieldidFj = env->GetFieldID(clazz, "Fj", "I"); // protected jfieldID fieldidFk = env->GetFieldID(clazz, "Fk", "I"); // private jfieldID fieldidFm = env->GetStaticFieldID(clazz, "Fm", "I"); // (非public/protected/private)的static // 获取 类属性字段的值 jint i = env->GetIntField(obj, fieldidFi); jint j = env->GetIntField(obj, fieldidFj); jint k = env->GetIntField(obj, fieldidFk); jint m = env->GetStaticIntField(clazz, fieldidFm); printf("i : %d ", i); printf("j : %d ", j); printf("k : %d ", k); printf("m : %d ", m); // 修改number的值为100,这里要注意的是jint对应C++是long型 ∴后面要加一个"L" env->SetIntField(obj, fieldidFi, 100 + i); env->SetIntField(obj, fieldidFj, 100 + j); env->SetIntField(obj, fieldidFk, 100 + k); env->SetStaticIntField(clazz, fieldidFm, 100 + m); }
3、Java代码:
package jniZ; import java.lang.reflect.Field; public class TjniField { public int Fi = 0; protected int Fj = 1; private int Fk = 2; static int Fm = 3; public native void NativeFunc(); public static void main(String[] args) throws Exception { //调用动态链接库 System.loadLibrary("JniField_VC6"); TjniField jniZ = new TjniField(); jniZ.NativeFunc(); // (1)、i System.out.println("Java Fi : "+jniZ.Fi); // (2)、j Class<?> clazz = jniZ.getClass(); Field fieldJ = clazz.getDeclaredField("Fj"); fieldJ.setAccessible(true); int j = fieldJ.getInt(jniZ); System.out.println("Java Fj : "+j); // (3)、k Field fieldK = clazz.getDeclaredField("Fk"); fieldK.setAccessible(true); int k = fieldK.getInt(jniZ); System.out.println("Java Fk : "+k); // (4)、m System.out.println("Java Fm : "+Fm); } }
4、Java控制台输出:
Java Fi : 100
Java Fj : 101
Java Fk : 102
Java Fm : 103
i : 0
j : 1
k : 2
m : 3
5、