【问题标题】:how to pass Extended ASCII characters through JNI via C++如何通过 C++ 通过 JNI 传递扩展的 ASCII 字符
【发布时间】:2011-09-16 08:55:52
【问题描述】:

我正在尝试通过 VC++ 使用 JNI,并将类路径中的自定义目录作为 UTF-8 字符串传递 -Djava.class.path=c:\myDir\my.jar

这很好用,我可以使用 FindClass 在 jar 中找到方法

但是当目录名称包含任何扩展的 ASCII 字符时,FindClass 会返回 NoClassDefFound 异常。我想这是因为 JVM 无法加载 jar 文件,而且我在传递参数时做错了。

这就是我所做的 1) 创建一个 std::wstring jarPath(L"-Djava.class.path=C:\ÆËñœ\my.jar"); 2) 使用 WideCharToMultiByte 将 wstring 转换为 CP_UTF8 3)将utf8String复制到optionString并调用JNI_CreateJavaJVM

我曾尝试在调用 JNI_CReateJavaJVM 之前将转换后的 utf8 打印到日志文件中,并且打印效果很好。

有人能告诉我 CP_UTF8(在 windows SDK WinN;s.h 中定义)是否不是 JNI 所期望的吗? 我该如何调试这个问题,非常感谢任何帮助。

提前致谢 拉胡尔

【问题讨论】:

    标签: c++ utf-8 java-native-interface extended-ascii


    【解决方案1】:

    documentation 建议选项字符串必须采用“默认平台编码”。这可能意味着您需要使用 CP_ACP。如果你的字符不能用那种编码表示,那么我不确定你能做多少。

    (是否可以使用文件的短名称代替?)

    【讨论】:

    • 我发现以下针对JVM的错误bugs.sun.com/…
    • 嗨艾伦,CP_ACP 运行良好。但是你说的概率存在并且它可能会失败,但无论如何它比仅支持 127 个 ASCII 字符要好得多。
    • 我尝试提供 JVM 的相对路径,例如JAR 位于我的产品安装目录中,该目录还包含它自己的 JVM(在当前安装目录中)。所以我想我会给出JVM的相对路径。但这不起作用。
    • @Rahul:短名称 (GetShortPathName) 怎么样?我认为它们总是基本的 ASCII 字符。我原以为相对路径会起作用,只要你先设置当前目录。
    • @AlanStokes 可以禁用短名称(8.3 别名)以提高性能。
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2014-08-11
    • 2017-07-25
    相关资源
    最近更新 更多