IBM Container for ActiveX Documents - Eclipse Version
但是我發現如果使用它打開含有中文名稱的文檔,就會拋異常,看了它的代碼,發現
JNIEXPORT jint JNICALL Java_com_ibm_rcp_activex_ActivexDocumentWidget_createControl
(JNIEnv * env, jclass that, jint hwndParent, jstring filename, jstring progid, jint hwndShell,
jintArray fileMenu, jintArray containerMenu, jintArray windowMenu,
jint indexHelpMenu, jstring helpMenuItemPrefix)
{
ADD_TO_TRACE();
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (NULL == progid)
{
return 0;
}
const char * lpszProgid = env->GetStringUTFChars(progid, 0);
const char * lpszFileName = NULL;
if (NULL != filename)
{
lpszFileName = env->GetStringUTFChars(filename, 0);
}
這樣會引發jni的字符亂碼問題,在參考了《〈Java與C之間通過JNI傳遞中文字符串〉》的解決方案后
做了如下的改寫:
char* jstringToWindows( JNIEnv *env, jstring jstr );
if (NULL != filename)
{
lpszFileName = jstringToWindows( env, filename );
//lpszFileName = env->GetStringUTFChars(filename, 0);
}
char* jstringToWindows(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;
}
成功編譯后,可以正常使用了。