【问题标题】:Casting JNI Types to C++ Types将 JNI 类型转换为 C++ 类型
【发布时间】:2014-07-15 09:19:59
【问题描述】:

我在公司使用JNI,需要将一些Java类型转换为对应的C++类型。我成功地将 Java 字符串转换为 C++ 数组,但现在我正在努力处理其他一些 Java.lang 类型。 我需要将 Java.lang.Integer 和 Java.lang.Boolean 转换为相应的 C++ 类型。我采用了从字符串转换到整数转换的相同原则,但我只得到了一些错误的数字。仅供参考:我需要从不同的类中调用变量。所以 Integer 用在 foo.bar.IntField 和 Boolean 用 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。布尔值也是如此。我应该得到一个假,但该方法返回真。如果使用 CallInt 或 CallBooleanMethods,也会返回相同的错误值。 对于字符串,有一种获取 StringUTFChars 的方法。我认为这是一个格式错误。我希望我的解释很好,你可以帮助我。

编辑:根据 Tom Blodget 的建议,我发布了我的答案作为答案。

【问题讨论】:

  • 你从不检查任何返回值。这使得代码基本上无法调试。
  • 我从代码中删除了检查以降低可读性。但我能够找到问题所在,请参阅编辑了解更多信息
  • 请注意,GetStringUTFChars 将 Unicode/UTF-16 编码的 Java 字符串转换为以 0x00 结尾的 Unicode/*modified* UTF-8 编码字符串。如果这不是您在 C++ 端使用的,请使用 GetStringChars(不是 0x00-terminated)或调用 String.getBytes(Charset charset) 或类似方法。

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


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 2011-09-12
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多