如何从C ++ JNI获取Java Enum?

时间:2015-11-09 16:36:15

标签: java c++ java-native-interface

我正在通过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始终为null。 我的代码出了什么问题?我的代码是否正确地在对象中获取枚举字段?我应该在ClassFooJava类之外创建枚举吗? 我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:0)

  

我的代码出了什么问题?

Java_com_cummins_ctp_ClassFooJava

您正在实施的功能名称缺失。

  

我的代码是否正确地在对象中获取枚举字段?

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

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

我应该在ClassFooJava类之外创建枚举吗?

这取决于你。