Skip to content

访问静态域

访问静态域和访问非静态域类似。你要使用GetStaticFieldIDGetStaticXxxField/SetStaticXxxField函数。 它们几乎与非静态的情形一样。

示例

假设我们有一个FisherTom类。我们想要访问的静态变量是staticNumber1

public class FisherTom {
    private static int staticNumber1 = 200;

    static {
        System.loadLibrary("fisher-pole");
    }

    public native int nVisitStaticNumber1();

    public static native int nVisitStaticNumber2();
}

有2个native方法,nVisitStaticNumber1()nVisitStaticNumber2()。后者是静态本地方法。

对应的cpp实现代码分别如下:

nVisitStaticNumber1()的对应方法

extern "C"
JNIEXPORT jint JNICALL
Java_com_rustfisher_fishpole_worker_FisherTom_nVisitStaticNumber1(JNIEnv *env, jobject thiz) {
    jclass cls = env->GetObjectClass(thiz);
    jfieldID n_fid = env->GetStaticFieldID(cls, "staticNumber1", "I");
    jint n1 = env->GetStaticIntField(cls, n_fid);
    return n1;
}

nVisitStaticNumber2()的对应方法。

extern "C"
JNIEXPORT jint JNICALL
Java_com_rustfisher_fishpole_worker_FisherTom_nVisitStaticNumber2(JNIEnv *env, jclass clazz) {
    jfieldID n_fid = env->GetStaticFieldID(clazz, "staticNumber1", "I");
    jint n1 = env->GetStaticIntField(clazz, n_fid);
    return n1;
}

从上面2个方法可以看出,静态本地(static native)方法对应的cpp方法中,参数是jclass

nVisitStaticNumber1()的对应方法参数里是jobject。需要使用GetObjectClass来获得对应的jclass

两个方法在访问静态变量时,都调用GetStaticFieldID方法。

通过以上例子,我们了解如何用C++访问类的静态属性。