繁体   English   中英

如何从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始终为null。 我的代码有什么问题? 我的代码在做正确的事情来获取对象内的枚举字段吗? 我应该在ClassFooJava类之外创建枚举吗? 我真的很感谢您的帮助。

我的代码有什么问题?

Java_com_cummins_ctp_ClassFooJava

您正在实现的函数的名称丢失。

我的代码在做正确的事情来获取对象内的枚举字段吗?

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

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

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

随你(由你决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM