我正在尝试将 C++ std::string 转换为 jstring 并将其返回。这将很容易
JNIEnv*->NewStringUTF(stdString.c_str())
但问题是我正在转换的字符串中几乎随机散布了空字符。这是 c_str()
的问题, 但不是 std::string
. NewStringUTF
只会捕获全部 std::string
的一部分. std::string
有一些希望有一个 length()
函数,它获取全长,忽略有问题的 char* \0
字符。
有一个单独的函数NewString它接受一个 jchar* 和一个 jsize*,因此看起来很有希望,但我无法将 std::string 正确转换为 jchar*。我试着把它变成一个字节数组,但我可能做得不对。我在转换 length()
给出的 int 时遇到了进一步的问题转换成 jsize,这是 NewString 调用所需要的。
我用 vector<char> byteArray(stdString.begin(), stdString.end())
做了一些工作,但这并没有让我走得太远,可能是因为这弄乱了原始字符串。
这是我的基本入门函数,它使用没有空字符的字符串:
jstring StringToJString(JNIEnv * env, const std::string & nativeString) {
return env->NewStringUTF(nativeString.c_str());
}
附带说明一下,此函数在 JNI 包装器文件中用于返回对象的 std::string
。 .
感谢任何帮助或信息来源!
最佳答案
我根据 RedAlert 的建议制定了自己的解决方案。
Java 现在需要来自 native 调用的 byte[]:
private native byte[] toString(long thiz);
toString 方法现在在 std::string
上调用它内部的这个方法:
jbyteArray StringToJByteArray(JNIEnv * env, const std::string &nativeString) {
jbyteArray arr = env->NewByteArray(nativeString.length());
env->SetByteArrayRegion(arr,0,nativeString.length(),(jbyte*)nativeString.c_str());
return arr;
}
java层接收这样的数据:
byte[] byteArray = toString(mNativeInstance);
String nativeString = "";
try {
nativeString = new String(byteArray, "UTF-8");
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "Couldn't convert the jbyteArray to UTF-8");
e.printStackTrace();
}
关于java - C++ std::string 到固定长度的 jstring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27303316/