Java 如何获取传递给JNI的枚举值
我有一个Java应用程序和JNI(dll)。我想知道如何获取作为参数传递给JNI的枚举(int)的值 以下是枚举(Java): 以下是JNI代码(C++):Java 如何获取传递给JNI的枚举值,java,enums,java-native-interface,Java,Enums,Java Native Interface,我有一个Java应用程序和JNI(dll)。我想知道如何获取作为参数传递给JNI的枚举(int)的值 以下是枚举(Java): 以下是JNI代码(C++): 由于枚举是作为对象传递的,我如何才能得到它的值呢?您可以提供一个方法来返回value的值,然后从本机代码调用该值,并使用switch语句。以下是枚举中的方法: public int getValue() { return value; } 以及您的本地方法: JNIEXPORT jint JNICALL Java_Loader_C
由于枚举是作为对象传递的,我如何才能得到它的值呢?您可以提供一个方法来返回
value
的值,然后从本机代码调用该值,并使用switch
语句。以下是枚举中的方法:
public int getValue() {
return value;
}
以及您的本地方法:
JNIEXPORT jint JNICALL Java_Loader_Convert(JNIEnv*env、jobject obj、jobject信封类型){
jmethodide-envelopeGetValueMethod=(*env)->GetMethodID(env,(*env)->FindClass(env,“package/of/envelopeType”),“getValue”,“()I”);
jint value=(*env)->CallIntMethod(env,EnvelopeType,envelegetvaluemethod);
开关(值){
案例1:
//未指定
打破
案例0:
//没有
打破
...
}
//本机方法的其余部分
}
我无法使用@tbodt提供的解决方案,但他的解决方案离我很近,我能够找到解决方案
查看,有一个方法ordinal
,它将枚举值作为int
类型返回
我使用的代码与@tbodts解决方案中的lised几乎相同,但是传递到GetMethodID
函数中的字符串是不同的。我不需要创建getValue
方法,方法签名是()I
而不是I()
实际上,您可以调用
Enum.ordinal()
,而不是定义getValue()
方法
更简单的解决方案是稍微修改C代码,并在调用JNI函数时直接使用Enum.ordinal()
,即传递jint
而不是Enum
对象:
JNIEXPORT jint JNICALL Java_Loader_convert
(JNIEnv *env, jobject obj, jint EnvelopeType)
在Java中,你得到了一种
loader.convert(myEnvelopeType.ordinal());
在我了解JNI之后,我会在一分钟内告诉你。(只是开玩笑,我知道一点。)实际上,没有必要添加方法。本机函数也可以对私有字段“value”使用
GetFieldID()
,并使用GetIntField()
使用相同的开关逻辑来分析值。我不知道本机方法在没有类似setAccessible(true)
的情况下可以访问私有字段。感谢您的回复,我已经尝试了上面提供的代码,但是jvm在调用CallIntMethod时崩溃。代码如下:jclass-envelopeTypeClass=env->FindClass(“JacsLoader”);JMethodide EnvelopeGetValueMethod=env->GetMethodID(envelopeTypeClass,“getValue”,“I()”);jint envelopeTypeValue=env->CallIntMethod(EnvelopeType,InputDevelopegeTValueMethod);你有语法错误。将“I()”更改为->“()I”。第一个参数表示函数得到什么,第二个参数表示函数返回什么。()->我不接受争论。I->return int这才是真正的答案,因为它不需要修改枚举。谢谢,不过我可能只会将ordinal()值传递给接受int的JNI函数。对我来说似乎更干净。
JNIEXPORT jint JNICALL Java_Loader_Convert(JNIEnv *env, jobject obj, jobject EnvelopeType) {
jmethodID envelopeGetValueMethod = (*env)->GetMethodID(env, (*env)->FindClass(env, "package/of/envelopeType"), "ordinal", "()I");
jint value = (*env)->CallIntMethod(env, EnvelopeType, envelopeGetValueMethod);
switch (value) {
case -1:
// not specified
break;
case 0:
// none
break;
...
}
// rest of native method
}
JNIEXPORT jint JNICALL Java_Loader_convert
(JNIEnv *env, jobject obj, jint EnvelopeType)
loader.convert(myEnvelopeType.ordinal());