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

    遇到转换中文字符的问题,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.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值