【问题标题】:JNI start jvm with unicode supportJNI 启动 jvm 支持 unicode
【发布时间】:2023-04-05 15:05:01
【问题描述】:

我正在使用调用 api 在 C 代码中加载和运行 jvm。我正在使用 java 结构 JavaVMOption 来执行此操作。具体来说,我正在使用它的元素 字符 *选项字符串 指定我的-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 本身,但这也不起作用。请问有人有解决办法吗?

【问题讨论】:

  • 不知道命令行参数有没有解决办法。但是由于您只想指定-D 选项,因此您可以使用JNI 调用System.setProperty 来实现相同的目的。
  • 感谢您的建议。我已经尝试过你上面提出的解决方案,但是,我不知道用户是否可以设置其他参数,bs.prefsdir 只是一个示例,我需要在命令行中支持 unicode 以用于其他参数。 Eclipse 启动器工作正常。我不知道eclipse启动器中的魔法是什么?在大多数情况下,我使用 eclipse 启动器在可执行文件中启动我的应用程序,例如 eclipse 可执行文件。有时,我需要启动 jvm 并将其加载到 dotnet 进程中,这就是为什么我需要使用 JavaVMOption 传递和支持 unicode。
  • 也许查看 Eclipse 启动器的源代码会有所帮助。
  • @user3005398 Eclipse 没有调用 JNI_CreateJavaVM;它将这些参数传递给命令行。它们不是一回事
  • 您能详细说明一下它的工作原理吗?或者一些链接?好像话题少了。

标签: java unicode java-native-interface option invocation


【解决方案1】:

传递给 JNI_CreateJavaVM 的参数采用平台的默认编码,所以我不相信您能够将宽字节字符串传递给 JavaVMOption 结构。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2011-04-15
    相关资源
    最近更新 更多