JNI启动JVM并支持Unicode

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本身,但这也无效。请问有人有解决办法吗?


不知道是否有命令行参数的解决方案。但是,由于你只想指定一个-D选项,因此可以使用JNI来调用System.setProperty以实现相同的效果。 - Holger
谢谢您的建议。我已经尝试了您上面提出的解决方案,但是我不知道用户是否可以设置其他参数,bs.prefsdir只是一个例子,我需要支持命令行中其他参数的Unicode。Eclipse启动器运行良好。我不知道Eclipse启动器的魔力在哪里?在大多数情况下,我使用Eclipse启动器在可执行文件中启动我的应用程序,例如Eclipse可执行文件。有时,我需要启动jvm并将其加载到dotnet进程中,因此我需要使用JavaVMOption传递和支持Unicode。 - WeidongLian
也许查看Eclipse启动器的源代码会有所帮助。 - Holger
@user3005398 Eclipse没有调用JNI_CreateJavaVM函数;它将这些参数传递给命令行。它们并不是同一件事情。 - Samhain
请问您能详细说明一下大致的工作原理吗?或者提供一些相关链接吗?似乎相关主题比较少。 - WeidongLian
1个回答

2

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

在创建JVM之后,尝试使用正确编码风格的jstring设置系统属性,以实现Holger的建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接