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;
}
成功编译后,可以正常使用了。