4

我有一个 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)

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

4

3 回答 3

7

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

查看java enum 文档,有一种方法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
}
于 2015-01-26T22:39:30.920 回答
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
}
于 2013-08-06T06:48:51.343 回答
3

实际上,getValue()您可以调用Enum.ordinal().

一个更简单的解决方案是稍微修改您的 C 代码并Enum.ordinal()在调用 JNI 函数时直接使用,即传递 ajint而不是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

于 2015-08-07T09:41:31.977 回答