3

我正在使用调用 api 在 C 代码中加载和运行 jvm。我正在使用 java 结构 JavaVMOption 来执行此操作。具体来说,我使用它的元素 char *optionString 来指定-Dbs.prefsdir="c:\\develop\\XXXXChineseMixedLationCharsXXXX\\" 路径bs.prefdir可以由用户定义的位置。

我正在做的是直接从 java 示例中提取出来,并且在我需要使用宽字符/unicode 路径之前它工作得很好——我不能这样做,因为 optionString 是 char* 而不是 wchar_t*。有人知道如何解决这个问题吗?解决方案应仅限于 JDK 1.6 及更低版本。

我已仔细阅读 JNI 文档: http ://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#wp633

char *optionString;  /* the option as a string in the default platform encoding */

我已经阅读了 eclipse 可执行启动器源代码的一部分,它在那里做了一些事情,比如使用默认代码页将宽字符转换为多字节字符:

int byteCount = WideCharToMultiByte (CP_ACP, 0, (wchar_t *)src, -1, NULL, 0, NULL, NULL);
    char *dest = malloc(byteCount+1);
    dest[byteCount] = 0;
    WideCharToMultiByte (CP_ACP, 0, (wchar_t *)src, -1, dest, byteCount, NULL, NULL);
    return dest;

我尝试使用上面的代码将 optionString 视为多字节字符串,但这不起作用。我曾尝试将其视为 unicode 本身,但这也不起作用。请问有人有解决方案吗?

4

1 回答 1

2

传递给 JNI_CreateJavaVM 的参数采用平台的默认编码,因此我认为您无法将宽字节字符串传递给 JavaVMOption 结构。

尝试 Holger 的建议,即在创建 JVM 后使用正确编码样式的 jstring 设置系统属性。

于 2013-11-18T16:45:31.037 回答