将JNI类型转换为C ++类型

时间:2014-07-15 09:20:00

标签: java c++ java-native-interface

我在公司使用JNI,需要将一些Java类型转换为相应的C ++类型。我成功地将Java String转换为C ++数组,但现在我正在努力使用其他一些Java.lang类型。 我需要将Java.lang.Integer和Java.lang.Boolean转换为相应的C ++类型。我从String转换到整数转换调整了相同的原则,但我只得到一些错误的数字。仅供参考:我需要从分离的类中调用变量。因此,整数用于foo.bar.IntField和foo.bar.BooleanField中的布尔值 以下是我到目前为止的情况:

jclass fieldClass = env->FindClass("foo/bar/IntField");
jmethodID getValue = env->GetMethodID(fieldClass, "getValue", "()Ljava/lang/Integer;");
jint value = (jint)env->CallObjectMethod(fieldObject, getValue);
int val = (int)value;

我遇到的问题是我没有从该方法中获得正确的数字。我应该得到一个0但该方法返回267713816. bool值也是如此。我应该得到一个假,但该方法返回true。如果使用CallInt或CallBooleanMethods,也会返回相同的错误值。 对于Strings,有一种获取StringUTFChars的方法。我认为这是格式化错误。我希望我的解释很好,你可以帮助我。

编辑:正如Tom Blodget所建议的那样,我将答案作为答案发布。

1 个答案:

答案 0 :(得分:2)

我发现了问题:我需要从IntField获取整数,在这个对象上我需要从Integer类中调用intValue方法。

jclass integerClass = env->FindClass("java/lang/Integer");
jmethodID integerID = env->GetMethodID(integerClass, "intValue", "()I");
jint jintVal = (jint)env->CallIntMethod(value, integerID);
int val = (int)jintVal;

布尔值也是如此。

jclass BooleanClass = env->FindClass("java/lang/Boolean");
jmethodID booleanID = env->GetMethodID(BooleanClass, "booleanValue", "()Z");
jboolean jBoolVal = (jboolean)env->CallBooleanMethod(jBoolean, booleanID);
bool boolVal = (bool)jBoolVal;