JNI:转换长度超过87个字符的jstrings会返回随机字符

时间:2015-07-03 07:48:44

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

我正在搞乱JNI,我需要将一个jstring解析为一个const char *,它工作正常,直到我传入一个长度超过87个字符的字符串。这是Java代码:

final StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append('.');
for(int i = 86; --i >= 0;) {
    stringBuilder.append('a');
}
System.out.println(stringBuilder.length()); //I used this to check the length until I got to the point where it would start returning random characters.
myFunction(stringBuilder.toString()); //It's not actually called myFunction.

这是C ++代码:

const char* keyPathNative = env->GetStringUTFChars(keyPath, JNI_FALSE);
env->ReleaseStringUTFChars(keyPath, keyPathNative);
std::cout << keyPathNative << std::endl;

我只收录了相关的部分。这是输出:

88
Ð0~

如果我再次执行相同的代码,它会提供不同的输出:

88
`¢¶

有人可以告诉我为什么会发生这种情况和/或如何修复它?

1 个答案:

答案 0 :(得分:4)

不要这样做:

env->ReleaseStringUTFChars(keyPath, keyPathNative);
std::cout << keyPathNative << std::endl;

来自GetStringUTFChars的{​​{3}}:

  

返回一个指向字节数组的指针,该字节数组表示修改后的UTF-8编码中的字符串。 此数组在ReleaseStringUTFChars()发布之前有效。

keyPathNative之后指向的内存可能已在ReleaseStringUTFChars之后被释放,因此在ReleaseStringUTFChars之后尝试引用该内存将导致未定义的行为。