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

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

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

相关文章:

java - Cloud endpoint api 中的函数 User.getUserId() 为不为 null 的用户对象返回 null

c++ - 从 C++ 中的集合中删除最后一个元素

Python 3.4 解码字节

php - 如何在 XPath 评估之前处理字符串中的双引号?

java - 在 Java MVC 模式中将 View 与 Controller 解耦

java - 错误 :cannot find symbol class RecyclerView

java - 检查两个不同的 ArrayLists 是否相等

c++ - 在 C++ 中的字符串之间添加一个字符

C++ 通过引用传递 : error: no matching function for call

python - 在 Python 中连接字符串的首选方法是哪种?