如何从C++;JNI? 我通过java JNI创建一个简单的C++包装器来访问java代码。我的问题是,我在java代码中枚举了我需要从我的C++ JNI代码中获取值。最好的方法是什么
以下是我的Java代码快照:如何从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()
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;");