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

时间:2013-08-06 06:42:07

标签: java enums java-native-interface

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

这是枚举(Java):

public enum envelopeType
{
    NOT_SPECIFIED(-1),
    NONE(0),
    IMAGE(1),
    BITMAP(2);

    private int value;

    private envelopeType(int value)
    {
        this.value = value;
    }   
}

这是JNI代码(C ++):

JNIEXPORT jint JNICALL Java_Loader_Convert
  (JNIEnv *env, jobject obj, jobject EnvelopeType)

因为枚举是作为对象传递的,我怎么能得到它的值?

3 个答案:

答案 0 :(得分:4)

我无法使用@tbodt提供的解决方案,但他已经足够接近,我能够找到解决方案。

查看java enum documentaiton方法ordinal会将枚举值作为int类型返回。

我使用的代码几乎与@tbodts解决方案中的代码完全相同,但是传递到GetMethodID函数的字符串是不同的。我不需要创建getValue方法,方法签名为()I而不是I()

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
}

答案 1 :(得分:3)

您将提供一种方法来返回value的值,然后从本机代码中调用它并使用switch语句。这是枚举中的方法:

public int getValue() {
    return value;
}

你的原生方法:

JNIEXPORT jint JNICALL Java_Loader_Convert(JNIEnv *env, jobject obj, jobject EnvelopeType) {
    jmethodID envelopeGetValueMethod = (*env)->GetMethodID(env, (*env)->FindClass(env, "package/of/envelopeType"), "getValue", "()I");
    jint value = (*env)->CallIntMethod(env, EnvelopeType, envelopeGetValueMethod);
    switch (value) {
        case -1:
        // not specified
        break;
        case 0:
        // none
        break;
        ...
    }
    // rest of native method
}

答案 2 :(得分:2)

实际上,您可以拨打getValue()

,而不是定义Enum.ordinal()方法

更简单的解决方案是稍微修改您的C代码并在调用JNI函数时直接使用Enum.ordinal(),即传递jint代替Enum对象:

JNIEXPORT jint JNICALL Java_Loader_convert
  (JNIEnv *env, jobject obj, jint EnvelopeType)

在Java中你有一种

loader.convert(myEnvelopeType.ordinal());

http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#ordinal%28%29