遇到转换中文字符的问题,windows下的jni开发可以直接使用windows下的api函数MultiByteToWideChar来转换,但NDK中没法使用,尝试使用C中的mbstowcs代替,依然不行,查了一下,居然在NDK下mbstowcs不起作用,形同虚设,根本不支持宽字符的转换!
网上有说是可以使用ICU库来实现转换,折腾半天还是不能实现,转换函数ucnv_convert总是失败,返回错误码为4,在网上也没有具体的资料可以参考,于是果断放弃。
那就换思路吧,不要想着把中文字符转换成jstring再传给java端,直接把char内存传过去在java层转换,一切ok!实现的相关代码:
jni端:
//需要转换的中文字符
char buffer[100] = "我们是共产主义接班人!\0";
//java层必须有个类,子项为test
jfieldID ID = env->GetFieldID (class, "test", "[B");
//转换函数
void SetBytes2Array (JNIEnv* env, jobject obj, jfieldID id, char * buffer)
{
int len = strlen(buffer);
jbyteArray jbArray = env->NewByteArray(len);
env->SetByteArrayRegion (jbArray, 0, len, (jbyte *)buffer);
env->SetObjectField(obj, id, jbArray);
env->DeleteLocalRef(jbArray);
}
java端实现转换:
public String BytesToString (byte[] bCon)
{
String str1 = null;
try {
str1 = new String (bCon, "GBK");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str1;
}
参考的资料:
[1]Android NDK 下的宽字符编码转换及icu库的使用 http://blog.youkuaiyun.com/liujian885/article/details/6536897
[2]JNI学习积累之一 ---- 常用函数大全 http://blog.youkuaiyun.com/qinjuning/article/details/7595104
[3]JNI 返回结构体参数 http://dolphin-ygj.iteye.com/blog/519489