💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
访问静态属性与访问对象实例属性是很相似的,让我们看下下边稍微讲过改变的InstanceFieldAccess示例: ~~~ class StaticFieldAccess { static { System.loadLibrary("StaticFieldAccess"); } private static int si; private native void accessField(); public static void main(String args[]) { StaticFieldAccess c = new StaticFieldAccess(); StaticFieldAccess.si = 100; c.accessField(); System.out.println("In Java:"); System.out.println(" StaticFieldAccess.si = " + si); } } ~~~ StaticFieldAccess类包含了一个静态属性si。StaticFieldAccess.main方法创建了一个对象,初始化静态属性,然后调用原生方法StaticFieldAccess.accessField.正如我们看到的那样,原生函数输出了静态属性的当前值并将其修改为一个新的值。为了证实静态属性是确实被修改了,程序在原生方法返回之后再次打印了静态属性的值。 以下是StaticFieldAccess。accessField 原生方法的实现: ~~~ #include <jni.h> #ifdef __cplusplus extern "C" { #endif /* * Class: StaticFieldAccess * Method: accessField * Signature: ()V */ JNIEXPORT void JNICALL Java_StaticFieldAccess_accessField (JNIEnv *env, jobject obj) { jfieldID fid; /* store the field ID */ jint si; /* Get a reference to obj's class */ jclass cls = (*env)->GetObjectClass(env, obj); printf("In C:\n"); /* Look for the static field si in cls */ fid = (*env)->GetStaticFieldID(env, cls, "si", "I"); if(!fid) { return; /* field not found */ } /* Access the static field si */ si = (*env)->GetStaticIntField(env, cls, fid); printf(" StaticFieldAccess.si = %d\n", si); (*env)->SetStaticIntField(env, cls, fid, 200); } #ifdef __cplusplus } #endif ~~~ 运行以上代码java -cp . StaticFieldAccess,可以得到以下输出: ~~~ In C: StaticFieldAccess.si = 100 In Java: StaticFieldAccess.si = 200 ~~~