有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何从C++ JNI中获取java枚举?

我通过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++代码中,枚举字段总是空的。 我的代码怎么了?我的代码在对象中获取枚举字段是否正确?我应该在ClassFooJava类之外创建枚举吗? 我真的非常感谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

    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?

    这取决于你