gpt4 book ai didi

java - C++ std::string 到固定长度的 jstring

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:27 25 4
gpt4 key购买 nike

我正在尝试将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com