Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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
Java 如何获取传递给JNI的枚举值_Java_Enums_Java Native Interface - Fatal编程技术网

Java 如何获取传递给JNI的枚举值

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

我有一个Java应用程序和JNI(dll)。我想知道如何获取作为参数传递给JNI的枚举(int)的值

以下是枚举(Java):

以下是JNI代码(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());