我正在尝试将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
。
感谢您提供任何帮助或信息来源!
答案 0 :(得分:4)
我根据RedAlert的建议制定了自己的解决方案。
Java现在需要来自本机调用的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();
}