C ++ std :: string到jstring,长度固定
我正在尝试将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 byteArray(stdString.begin(), stdString.end())
完成了一些工作,但这并没有让我走得太远,可能是因为这弄乱了原始字符串是什么。
这是我的基本入门函数,它使用没有空字符的字符串:
jstring StringToJString(JNIEnv * env, const std::string & nativeString) { return env->NewStringUTF(nativeString.c_str()); }
作为旁注,此函数在JNI包装器文件中用于返回对象的std::string
。
感谢您的帮助或信息来源!
我根据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(); }