C++ std :: string到jstring,长度固定

Eli*_*ing 11 c++ java string java-native-interface

我正在尝试将C++ std :: string转换为jstring并返回它.这很容易

JNIEnv*->NewStringUTF(stdString.c_str())
Run Code Online (Sandbox Code Playgroud)

但问题是我正在转换的字符串几乎随机散布了空字符.这是一个问题c_str(),但不是std::string.NewStringUTF只会抓住一部分的全部std::string.有一些希望,std::string有一个length()函数,它获取全长,忽略有问题的char*\0字符.

有一个单独的函数NewString,它接受一个jchar*和一个jsize*,所以看起来很有希望,但我无法将std :: string正确转换为jchar*.我试着把它变成一个字节数组,但我可能做得不对.我有进一步的问题转换length()为由jsize 给出的int ,这是NewString调用所需要的.

我做了一些工作vector<char> byteArray(stdString.begin(), stdString.end()),但这并没有让我走得很远,可能是因为这弄乱了原来的字符串.

这是我的基本启动函数,它使用没有空字符的字符串:

jstring StringToJString(JNIEnv * env, const std::string & nativeString) {
    return env->NewStringUTF(nativeString.c_str());
}
Run Code Online (Sandbox Code Playgroud)

作为旁注,此函数正在JNI包装器文件中用于返回对象std::string.

感谢您的帮助或信息来源!

Eli*_*ing 4

我根据 RedAlert 的建议制定了自己的解决方案。

Java 现在需要来自本机调用的 byte[]:

private native byte[] toString(long thiz);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

而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();
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么还在用字符串?使用 UTF-8 对双精度数组进行编码没有任何意义 (2认同)