javascript代码实例教程-jstring 与 wchar_t 的那点事

发布时间:2019-01-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了javascript代码实例教程-jstring 与 wchar_t 的那点事脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。 jstring 对应java的 String  这个大家都知道

 

但是jstring 与wchar_t有何关系呢,这是个挺纠结的问题,最近一个项目的jni 的字符处理 全部要使用wchar_t,且要与java 通讯

 

首先 第一个想法,自然是百度,找到可以通过

 

GetStringLength

GetStringChars

 

先获取到jchar*,转定义看下jchar定义

 

 16 bITs双字节,哦耶wchar_t也是双字符(win下的习惯),这下好解决了直接按网上给的代码直接强转 然后memcpy 

看样子分分钟就解决了。

 

网上码:

复制代码

 1 wchar_t* w2js(JNIenv* env, jstring str) 

 2 {  

 3   int len = env->GetStringLength(str);   

 4   wchar_t *w_buffer = new wchar_t[len];    

 5   memset(w_buffer,0,len+1);

 6   w_buffer[len]='/0';    

 7   wcsncpy(w_buffer,(wchar_t *)env->GetStringChars(str,0),len);     

 8   env->ReleaseStringChars(str,(const unsigned short *)w_buffer);

 9   return w_buffer;        

10 }

11  

复制代码

 

 

测试的确是那么回事感觉正常的,然后测试了好些字符串好英文字符很正常,没啥问题.

 

于是开始测试中文, 中文第一次测试 15个字 调试代码获取长度15正常,在做完转换之后,长度就变成11了,尼玛,被截断了.

 

因为是wcsncpy正常理念中应该是不会有问题的,但实际上出的确出现问题,偶尔正常,偶尔有问题缺少字符.

 

接下来 做了个简单测试   sizeof(jchar) / sizeof(wchar_t)

 

才发现andROId的wchar_t与jchar使用的字节完全不一样,一个2字节一个4字节,拷贝过程中估计是因为这个出现了问题.

 

由于对字符处理没经验,基础知识又不扎实,肿么办呢, 纠结了一整天,没有解决,又纠结了一整天,还是没有解决,两天过去了,无意中百度到另外份代码,通过把指针当成数组的方式来处理的,实际上最后也是通过这种方式来解决的.

 

处理过程大致如下:

java -> String[utf-16(固定双字节)] -> jstring-> jchar[固定双字节] -> wchar_t[固定四字节]

双字节与四字节之间如何处理呢大家看下内存数据 

双字符  0x11 0x12

四字节  0x11 0x12 0x00 0x00

看完内存数据以后 大家应该明白怎么回事了吧!~

我们只要创建一个与jchar* 长度一样的 wchar_t*就可以了

 

然后把他们两者当作 数组来处理

jchar*   每个元素 双字节

wchar_t* 每个元素 四字节(且使用的是前两个字节)

 

我们就可以得到下面的代码 

 

复制代码

 1 //jstring 转换成 wchar_t

 2 //env :JNIEnv jni操作 不可或缺的

 3 //jstr:jstring 源字符(来自java)

 4 //dst :转换后的结果,四字节wchar_t 似乎linux专用

 5 //return :  无

 6 void js2w(JNIEnv *env,jstring jstr,wchar_t *dst)

 7 {

 8 //获取java字符串的长度  

 9 jsize jstr_len = env->GetStringLength(jstr);  

10 //获取java字符串的jchar指针  

11 const jchar * pjstr = env->GetStringChars(jstr,0);  

12 

13 tc_char *ptmp = new tc_char[jstr_len+1];

14 memset(ptmp,0,sizeof(tc_char) * (jstr_len+1));

15 //转换 以数组的形式把 jchar转换到wchar_t

16 for(int i=0 ;i<jstr_len;i++)

17 memcpy(&amp;ptmp[i],&pjstr[i],2);

18 

19 wcscpy(dst,ptmp);

20 delete [] ptmp;

21 }

复制代码

 

 

然后 wchar_t 转换jstring 原理只不过是一个逆向的过程,直接上源码

 

复制代码

 1 //wchar_t 转换成 jstring

 2 //env :JNIEnv jni操作 不可或缺的

 3 //src:wchar_t 源字符 四字节似乎linux专用

 4 //return :  转换完成以后的结果jstring

 5 jstring w2js(JNIEnv *env,wchar_t *src)

 6 {

 7 int src_len = wcslen(src);

 8 jchar * dest = new jchar[src_len+1];

 9 memset(dest,0,sizeof(jchar)*(src_len+1));

10 

11 for(int i =0 ;i<src_len;i++)

12 memcpy(&dest[i],&src[i],2);

13 jstring dst = env->NewString(dest,src_len);

14 delete [] dest;

15 return dst;

16 }

复制代码

 

 

本身这个转换是很简单的,只因为自己不了解这两种类型的本质,从而导致自己走了不少的弯路,但是在解决问题的过程中学到了非常多的东西

 

 

 

觉得可用,就经常来吧! 脚本宝典 欢迎评论哦! js脚本,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的javascript代码实例教程-jstring 与 wchar_t 的那点事全部内容,希望文章能够帮你解决javascript代码实例教程-jstring 与 wchar_t 的那点事所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。