Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C++;JNI? 我通过java JNI创建一个简单的C++包装器来访问java代码。我的问题是,我在java代码中枚举了我需要从我的C++ JNI代码中获取值。最好的方法是什么_Java_C++_Java Native Interface - Fatal编程技术网

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

如何从C++;JNI? 我通过java JNI创建一个简单的C++包装器来访问java代码。我的问题是,我在java代码中枚举了我需要从我的C++ JNI代码中获取值。最好的方法是什么,java,c++,java-native-interface,Java,C++,Java Native Interface,以下是我的Java代码快照: package mypackage; public class ClassFooJava { public enum MyEnum { Enabled (0), DoNothing (1), Disable (2) ; public int getValue()

以下是我的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;
    }
}
JNIEXPORT jint JNICALL Java\u com\u cummins\u ctp\u ClassFooJava
(JNIEnv*env、jobject obj、,
jobject j_myEnum)
{
jclass cls=env->GetObjectClass(obj);
jfieldID myEnumField=env->GetFieldID(cls,“MyEnum”,“Lmypackage.ClassFooJava;”);
如果(myEnumField==NULL)
{
//它总是空的
库特
我的代码有什么问题

缺少要实现的函数的名称

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

您正在将
MyEnum
作为参数传递。它是
j_MyEnum
。可能您需要
valueEnum

jfieldID valueEnumField = 
                     env->GetFieldID(cls, "valueEnum", "Lmypackage/ClassFooJava$MyEnum;");
我应该在ClassFooJava类之外创建枚举吗


这取决于您。

MyEnum
是一种枚举类型,而不是字段。如果您有类似于
private MyEnum MyEnum;
的内容,则字段就是;
嗨,Peter,我无法让它工作。。可能这行代码仍然不正确:env->GetFieldID(cls,“valueEnum”,“Lmypackage/ClassFooJava$MyEnum;”)但是,不管怎样,如果我把枚举放在我的CopeHuaveJava之外,它就可以工作。所以我把枚举当作JNI C++代码中的单独的“类”来处理。
jfieldID valueEnumField = 
                     env->GetFieldID(cls, "valueEnum", "Lmypackage/ClassFooJava$MyEnum;");