如何从 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 始终为空。
我的代码有什么问题?我的代码是否正确地获取了对象中的枚举字段?我应该在 ClassFooJava class 之外创建枚举吗?
我非常感谢任何帮助。
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?
这取决于你。
我正在通过 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 始终为空。 我的代码有什么问题?我的代码是否正确地获取了对象中的枚举字段?我应该在 ClassFooJava class 之外创建枚举吗? 我非常感谢任何帮助。
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?
这取决于你。