如何从 C++ JNI 获取 Java 枚举?

How to get Java Enum from C++ JNI?

我正在通过 Java JNI 创建一个简单的 C++ 包装器来访问我的 Java 代码。我的问题是,我的 Java 代码中有枚举,我需要从我的 C++ JNI 代码中获取值。最好的方法是什么?

这是我的 Java 代码快照:

package mypackage;

    public class ClassFooJava
    {   
        public enum MyEnum
        {
            Enabled    (0),
            DoNothing  (1),
            Disable    (2)
            ;

            public int getValue()
            {
                return valueEnum;
            }

            private final int valueEnum;

            private MyEnum(int valueEnum)
            {
                this.valueEnum = valueEnum;
            }
        }

        static 
        {
            try
            {
                System.load("MyCPlusPlus.dll");
            }
            catch(Exception e)
            {
                System.err.println("Caught exception: " + e.toString());

            }       
        }
        public native long GetInstance();
        public native void FreeInstance(long LearningAccess);
        public native int FooFunctionJava(MyEnum myEnum);
    }

这是我的 C++ 代码快照:

JNIEXPORT jint JNICALL Java_com_cummins_ctp_ClassFooJava
  (JNIEnv * env, jobject obj,
          jobject j_myEnum)
{
    jclass cls = env->GetObjectClass(obj);

    jfieldID myEnumField = env->GetFieldID(cls, "MyEnum",  "Lmypackage.ClassFooJava;");

    if (myEnumField == NULL)
    {
        // IT ALWAYS NULL
        cout << "NULL NULL NULL" << endl;
        return 0;
    }
}

请注意,在我的 C++ 代码中,enumField 始终为空。 我的代码有什么问题?我的代码是否正确地获取了对象中的枚举字段?我应该在 ClassFooJava class 之外创建枚举吗? 我非常感谢任何帮助。

What is wrong with my code?

Java_com_cummins_ctp_ClassFooJava

缺少您正在实现的函数的名称。

Is my code doing the right thing to get the enumeration field within the object?

您正在将 MyEnum 作为参数传递。是j_myEnum。也许你想要 valueEnum

jfieldID valueEnumField = 
                     env->GetFieldID(cls, "valueEnum", "Lmypackage/ClassFooJava$MyEnum;");

Should I create the enumeration outside my ClassFooJava class?

这取决于你。