JNI 传递字符串 编码方式处理

因为Java是采用Unicode作为字符串编码的。 
在JNI中只有四个函数GetStringUTF,NewStringUTF,GetStringChars,NewString, 
前两个使用UTF8(可变字节),后两个是使用Unicode字符(16位双字节), 
而本地的C程序时使用Gb2312或者GBK编码的,这样就会产生编码错误,导致乱码。 
所以采用WideCharToMultiByte和MultiByteToWideChar这两个函数把本地的 
GB2312和GBK码换成Unicode16编码,再使用Jni函数来转化成Java   String. 




/// 
//辅助函数:char*   jstringToWindows(JNIEnv*   env,jstring   jstr); 
//功能:将Java的Unicode字符串转化成本地字符数组; 
/// 
char*   jstringToWindows(JNIEnv*   env,jstring   jstr   ) 

    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
    int   length   =   env-> GetStringLength(jstr   ); 
    const   jchar*   jcstr   =   env-> GetStringChars(jstr,   0   ); 
    char*   rtn   =   (char*)malloc(   length*2+1   ); 
    int   size   =   0; 
    size   =   WideCharToMultiByte(   CP_ACP,   0,   (LPCWSTR)jcstr,   length,   rtn, 
                                                      (length*2+1),   NULL,   NULL   ); 
    if(   size   <=   0   ) 
        return   NULL; 
    env-> ReleaseStringChars(jstr,   jcstr   ); 
    rtn[size]   =   0; 
    return   rtn; 



/// 
//辅助函数:jstring   windowsToJstring(   JNIEnv*   env,   char*   str   ) 
//功能:将本地字符数组转化成Java的Unicode字符串; 
/// 
jstring   windowsToJstring(   JNIEnv*   env,   char*   str   ) 

    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
    jstring   rtn   =   0; 
    int   slen   =   strlen(str); 
    wchar_t*   buffer   =   0; 
    if(   slen   ==   0   ) 
        rtn   =   env-> NewStringUTF(str);   //UTF   ok   since   empty   string 
    else 
    { 
        int   length   =   MultiByteToWideChar(   CP_ACP,   0,   (LPCSTR)str,   slen,   NULL,   0   );
        buffer   =   (wchar_t*)malloc(   length*2   +   1   ); 
        if(   MultiByteToWideChar(   CP_ACP,   0,   (LPCSTR)str,   slen,   (LPWSTR)buffer,   length   )   > 0   ) 
            rtn   =   env-> NewString(   (jchar*)buffer,   length   ); 
    } 
    if(   buffer   ) 
      free(   buffer   ); 
    return   rtn; 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值