大概因?yàn)殚_(kāi)發(fā)環(huán)境是英文的緣故吧,做了這么久時(shí)間的SWT-Extension,直到今天才發(fā)現(xiàn)存取中文都是亂碼。不過(guò)顯而易見(jiàn)的是Test Case做得太少了,畢竟是自己的開(kāi)源項(xiàng)目,在上面投入的是興趣,而不是精力。雖然一直在弄,但動(dòng)輒就幾個(gè)月沒(méi)有commit,而且到現(xiàn)在也沒(méi)有一個(gè)正式版發(fā)布。本來(lái)可以積累一點(diǎn)user的,現(xiàn)在估計(jì)也都跑光了。
下面這段代碼用于JNI中jstring和Window char之間轉(zhuǎn)換:
char* jstringToNative( JNIEnv *env, jstring jstr )
{
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 nativeTojstring( JNIEnv* env, char* str )
{
jstring rtn = 0;
int slen = strlen(str);
unsigned short * buffer = 0;
if( slen == 0 )
rtn = env->NewStringUTF( str );
else
{
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
buffer = (unsigned short *)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;
}
JNI 用起來(lái)實(shí)在太麻煩了,比我做Java開(kāi)發(fā)效率實(shí)在低得太多,各種各樣的類(lèi)型轉(zhuǎn)換,我頭都暈了…… 另外JNI好像是SUN中國(guó)研究院搞的,怎么就沒(méi)有提供一個(gè)好的中文解決方案?
Eclipse SWT Extension snapshot:




