我正在搞乱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
`¢¶
有人可以告诉我为什么会发生这种情况和/或如何修复它?
答案 0 :(得分:4)
不要这样做:
env->ReleaseStringUTFChars(keyPath, keyPathNative);
std::cout << keyPathNative << std::endl;
来自GetStringUTFChars
的{{3}}:
返回一个指向字节数组的指针,该字节数组表示修改后的UTF-8编码中的字符串。 此数组在
ReleaseStringUTFChars()
发布之前有效。
keyPathNative
之后指向的内存可能已在ReleaseStringUTFChars
之后被释放,因此在ReleaseStringUTFChars
之后尝试引用该内存将导致未定义的行为。