因为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;
}