9910

单飞

   :: 首页 :: 联系 :: 聚合  :: 管理

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

成功编译后,可以正常使用了。


posted on 2008-08-09 22:52 单飞 阅读(269) 评论(0)  编辑  收藏 所属分类: Eclipse Plugin

只有注册用户登录后才能发表评论。


网站导航: