【发布时间】: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