我有一个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)
因为枚举是作为对象传递的,我怎么能得到它的值?
答案 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