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

时间:2014-12-04 20:23:16

标签: 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

感谢您提供任何帮助或信息来源!

1 个答案:

答案 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();
}