JNI 中文字符串传递
来源:互联网 发布:淘宝网购汽车座椅 编辑:程序博客网 时间:2024/06/06 03:04
因为项目编码中通过JNI传递中文字符时出现乱码问题,特搜集了相关资料,整理如下:
java内部是使用16bit的unicode编码(UTF-16)来表示字符串的,无论中文英文都是2字节;
jni内部是使用UTF-8编码来表示字符串的,UTF-8是变长编码的unicode,一般ascii字符是1字节,中文是3字节;
c/c++使用的是原始数据,ascii就是一个字节了,中文一般是GB2312编码,用两个字节来表示一个汉字。
1、java --> c/c++
这种情况中,java调用的时候使用的是UTF-16编码的字符串,jvm把这个字符串传给jni,c/c++得到的输入是jstring,这个时候,可以利用jni提供的两种函数,一个是GetStringUTFChars,这个函数将得到一个UTF-8编码的字符串;另一个是GetStringChars这个将得到UTF-16编码的字符串。无论那个函数,得到的字符串如果含有中文,都需要进一步转化成GB2312的编码。
在C++编写的DLL文件中添加如下转换函数:
char * JStringToCharArray(JNIEnv * pJNIEnv, jstring jstr)
{
jsize len = pJNIEnv->GetStringLength( jstr );
const jchar * jcstr = pJNIEnv->GetStringChars( jstr, NULL );
int size = 0;
char * str = ( char * )malloc( len * 2 + 1 );
if ( (size = WideCharToMultiByte( CP_ACP, 0, LPCWSTR( jcstr ), len, str, len * 2 + 1, NULL, NULL ) ) == 0 )
return NULL;
pJNIEnv->ReleaseStringChars( jstr, jcstr );
str[ size ] = 0;
return str;
}
假设DLL中以下这个函数接受到JAVA传递的带有中文的字符串jMsg,处理如下:
JNIEXPORT void JNICALL Java_Test_hello(JNIEnv * env, jclass obj, jstring jMsg)
{
//若使用const char *strMsgPtr = env->GetStringUTFChars( jMsg , 0)则会出错
char * strMsgPtr = JStringToCharArray( env, jMsg ); //使用上面提供的转换函数接收字符串
/*
接下来便可使用strMsgPtr做你所需要的处理
*/
}
2、c/c++ --> java
jni返回给java的字符串,c/c++首先应该负责把这个字符串变成UTF-8或者UTF-16格式,然后通过NewStringUTF或者NewString来把它封装成jstring,返回给java就可以了。
如果字符串中不含中文字符,只是标准的ascii码,那么用GetStringUTFChars/NewStringUTF就可以搞定了,因为这种情况下,UTF-8编码和ascii编码是一致的,不需要转
但是如果字符串中有中文字符,那么在c/c++部分进行编码转换就是一个必须了。
转载自: http://hi.baidu.com/ivy_jing/blog/item/1a2d90899712f119c8fc7a29.html
java内部是使用16bit的unicode编码(UTF-16)来表示字符串的,无论中文英文都是2字节;
jni内部是使用UTF-8编码来表示字符串的,UTF-8是变长编码的unicode,一般ascii字符是1字节,中文是3字节;
c/c++使用的是原始数据,ascii就是一个字节了,中文一般是GB2312编码,用两个字节来表示一个汉字。
1、java --> c/c++
这种情况中,java调用的时候使用的是UTF-16编码的字符串,jvm把这个字符串传给jni,c/c++得到的输入是jstring,这个时候,可以利用jni提供的两种函数,一个是GetStringUTFChars,这个函数将得到一个UTF-8编码的字符串;另一个是GetStringChars这个将得到UTF-16编码的字符串。无论那个函数,得到的字符串如果含有中文,都需要进一步转化成GB2312的编码。
在C++编写的DLL文件中添加如下转换函数:
char * JStringToCharArray(JNIEnv * pJNIEnv, jstring jstr)
{
jsize len = pJNIEnv->GetStringLength( jstr );
const jchar * jcstr = pJNIEnv->GetStringChars( jstr, NULL );
int size = 0;
char * str = ( char * )malloc( len * 2 + 1 );
if ( (size = WideCharToMultiByte( CP_ACP, 0, LPCWSTR( jcstr ), len, str, len * 2 + 1, NULL, NULL ) ) == 0 )
return NULL;
pJNIEnv->ReleaseStringChars( jstr, jcstr );
str[ size ] = 0;
return str;
}
假设DLL中以下这个函数接受到JAVA传递的带有中文的字符串jMsg,处理如下:
JNIEXPORT void JNICALL Java_Test_hello(JNIEnv * env, jclass obj, jstring jMsg)
{
//若使用const char *strMsgPtr = env->GetStringUTFChars( jMsg , 0)则会出错
char * strMsgPtr = JStringToCharArray( env, jMsg ); //使用上面提供的转换函数接收字符串
/*
接下来便可使用strMsgPtr做你所需要的处理
*/
}
2、c/c++ --> java
jni返回给java的字符串,c/c++首先应该负责把这个字符串变成UTF-8或者UTF-16格式,然后通过NewStringUTF或者NewString来把它封装成jstring,返回给java就可以了。
如果字符串中不含中文字符,只是标准的ascii码,那么用GetStringUTFChars/NewStringUTF就可以搞定了,因为这种情况下,UTF-8编码和ascii编码是一致的,不需要转
但是如果字符串中有中文字符,那么在c/c++部分进行编码转换就是一个必须了。
转载自: http://hi.baidu.com/ivy_jing/blog/item/1a2d90899712f119c8fc7a29.html
0
上一篇:LINUX下GDB调试(转)
下一篇:VIM 用空格替换 Tab
相关热门文章
- linux 常见服务端口
- 【ROOTFS搭建】busybox的httpd...
- 什么是shell
- linux socket的bug??
- linux的线程是否受到了保护?...
- 修改默认端口为222,centos自...
- 用PHP做一个ftp登录页面...
- Toad for Oracle工具,为什么在...
- 本地win7安装vmw9系统winserv...
- powermt config是所什么用的...
给主人留下些什么吧!~~
评论热议
- JNI 中文字符串传递
- 5.5JNI中文字符串传递
- JNI技术——JNI传递对象和JNI传递中文字符串
- Java与C之间通过JNI传递中文字符串
- Java与C之间通过JNI传递中文字符串
- Android JNI 中文字符传递
- JAVA->JNI 传递字符串数组
- Java与C之间通过JNI传递中文字符串及乱码问题
- jni生成so动态库,a静态库,传递中文字符串
- jni的中文字符串处理
- jni的中文字符串处理
- jni的中文字符串处理
- JNI 传递字符串 编码方式处理
- JNI 传递字符串和结构体
- jni怎么传递一个字符串数组
- JNI String 字符串 的传递与返回
- JNI传递字符串数组J-StringArray
- jni中如何传递字符串或者数组
- 用crosstool-ng建立Linux 交叉编译环境
- ubifs文件系统构建
- 第三方 cookie 写入问题
- LINUX下GDB调试(转)
- C++中的类所占内存空间总结
- JNI 中文字符串传递
- VIM 用空格替换 Tab
- 硬件工程师电路设计必须紧记的十大要点(转帖)
- C/C++不同文件夹下包含头文件的方法及#include的使用
- hdu 1568 Fibonacci
- ORACLE数据库自动备份生成压缩文件
- 调试工具
- s3c2440支持nand flash硬件ecc(u-boot+linux)
- 使用rmmod会出现 No such file or directory
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
什么读
读若
单姓氏怎么读
单宁怎么读
读长恨辞
提手旁加单读什么
单丛茶怎么读
单读什么音
田童读什么
买读什么
壹读什么
什么读什么
什么是品读
单质
什么是单质
单质是什么
单质有哪些
单身证明
单身男女
单身生活2
单身生活
单身狗影院
单身情歌
单身狗
单身影院
单身
单身母亲
单身奶爸
单身女老板
母胎单身
单身女王
单身狗图片
单身复叶
单身男女2
单身母亲3
单身母亲6
bj单身日记
单身 英文
单身英语
单身歌
单身快乐