如何从JNI设置Java枚举字段?

use*_*951 5 java java-native-interface enums

如何从JNI 设置 Java enum字段?这是示例代码.我想在本机函数"get_state"中设置我的B对象的"myState"字段.

public class A {

    public enum STATE { 
        STATE_ONE,
        STATE_TWO
    }

    public static class B {
        public STATE myState;
    }

    public native void get_state(B b);

    public B getB() {
        B b;

        // Call JNI to get the state
        get_state(b);

        return b;
    }
}


JNIEXPORT void JNICALL Java_A_get_1state(JNIEnv *env, jobject object, jobject b_object)
{
    /* Get a reference to obj's class */
    jclass cls = (*env)->GetObjectClass(env, b_object);

    //How do I set B object's "myState" field?

}
Run Code Online (Sandbox Code Playgroud)

blk*_*ian 5

因为它是一个嵌套的枚举类,所以 STATE 是隐式静态的。有很多资源,但可以在此处找到准确说明这一点的 Google 搜索:http : //www.javapractices.com/topic/TopicAction.do?Id=1

这允许在 enum 类的 valueOF methodID 之上使用另一种方法。您可以使用 env->GetStaticField 和 env->GetStaticObjectField 来获取要设置的枚举。

前任:

jclass theStateClass = env->FindClass("your/containingPackage/A$STATE");
jfieldID stateOneField    = env->GetStaticFieldID(theStateClass, "STATE_ONE", "Lyour/containingPackage/A$STATE;");
jobject STATE_ONE = env->GetStaticObjectField(theStateClass, stateOneField);
Run Code Online (Sandbox Code Playgroud)


Aar*_*lla 0

就像当您只有枚举名称时在 Java 中执行此操作一样:

  1. 通过 JNI 查找类实例。
  2. 调用valueOf(String)枚举类的方法