我正在通过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类之外创建枚举吗? 我真的很感激任何帮助。
答案 0 :(得分:0)
我的代码出了什么问题?
Java_com_cummins_ctp_ClassFooJava
您正在实施的功能名称缺失。
我的代码是否正确地在对象中获取枚举字段?
您正在传递MyEnum
作为参数。它是j_myEnum
。也许你想要valueEnum
jfieldID valueEnumField =
env->GetFieldID(cls, "valueEnum", "Lmypackage/ClassFooJava$MyEnum;");
我应该在ClassFooJava类之外创建枚举吗?
这取决于你。