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

Casting JNI Types to C++ Types

本文关键字:c++ 类型 类型转换 JNI      更新时间:2023-10-16

我在公司使用JNI,需要将一些Java类型转换为相应的c++类型。我成功地将Java字符串转换为c++数组,但现在我正在努力使用其他Java。朗类型。我需要将Java.lang.Integer和Java.lang.Boolean转换为相应的c++类型。我采用了从字符串转换到整数转换的相同原则,但我只得到一些假数字。仅供参考:我需要从分离的类调用变量。整数在foo。bar。intfield中使用布尔值在foo。bar。Boolean field中使用以下是目前为止的内容:

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值也是如此。我应该得到假,但方法返回真。如果使用CallInt或callboolean方法,也会返回相同的错误值。对于字符串,有一种方法可以获得StringUTFChars。我认为这是一个格式错误。我希望我的解释是好的,你可以帮助我。

编辑:根据Tom Blodget的建议,我把我的答案贴出来作为答案。

我发现了问题:我需要从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;