NDK与java传递中文字符的解决办法

来源:互联网 发布:淘宝卖家退款要验证码 编辑:程序博客网 时间:2024/05/21 21:50

    遇到转换中文字符的问题,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层必须有个类,子项为testjfieldID 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 blocke.printStackTrace();}return str1;}


参考的资料:

[1]Android NDK 下的宽字符编码转换及icu库的使用 http://blog.csdn.net/liujian885/article/details/6536897
[2]JNI学习积累之一 ---- 常用函数大全 http://blog.csdn.net/qinjuning/article/details/7595104
[3]JNI 返回结构体参数 http://dolphin-ygj.iteye.com/blog/519489



0 0
原创粉丝点击