Temurin-build: java.exe路径中的汉字导致“无法加载本机库”错误

创建于 2020-01-27  ·  8评论  ·  资料来源: adoptium/temurin-build

平台和:架构:
Windows10.0.18362
OpenJDK11U-jre_x64_windows_hotspot_11.0.6_10.zip
OpenJDK11U-jre_x86-32_windows_hotspot_11.0.6_10.zip

重现此问题的步骤:

  1. https://adoptopenjdk.net/releases.html下载上述的JRE
  2. 解压缩。
  3. 将“ jdk-11.0.6 + 10-jre”重命名为“ jdk汉字含む”(“汉字含む”为4个汉字)
  4. 执行java.exe,如下所示:
$ jdk漢字含む\bin\java -version
Error occurred during initialization of VM
Unable to load native library:

$ ren jdk漢字含む jdk
$ jdk\bin\java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.6+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.6+10, mixed mode)

jdk-11.0.5 + 10-jre并未引起此错误。
感谢您的二进制文件。

jdkissue2

Reported to OpenJDK / JBS bug

最有用的评论

我在jdk / jdk中修复了此问题,并将其反向移植到

所有8条评论

看起来与韩文字符相同

用户在我的应用程序上报告,jlink使用jdk-11.0.6 + 10构建
image

图片中的启动脚本

<strong i="10">@echo</strong> off
set DIR="%~dp0"
set JAVA_EXEC="%DIR:"=%\java"
%JAVA_EXEC%  -p "%~dp0/../app" -m com.pmm.ParadoxosGameModManager/com.pmm.ParadoxosGameModManager.ModManager  %*

编辑:还测试了11.0.5,确认它有效

@ himawari-san能否请您通过acceptopenjdk.net/upstream.html尝试11.0.6?

@karianna我遇到了同样的错误。
谢谢你的支持。

openjdk_ss

我认为这是上游的错误。 我在当前的jdk / jdk源上确认了此问题。 它会在任何包含CJK字符的路径上发生。

我可以使用以下修补程序对其进行修复,因此我想在OpenJDK中发送对hotspot-runtime-dev的审阅请求。 您曾经为OpenJDK社区工作过吗? 如果不是这样,我将其提交给JBS。

diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp
--- a/src/hotspot/os/windows/os_windows.cpp
+++ b/src/hotspot/os/windows/os_windows.cpp
@@ -4207,14 +4207,16 @@
     size_t prefix_len = wcslen(prefix);
     size_t full_path_size = is_abs ? 1 + buf_len : JVM_MAXPATHLEN;
     size_t result_size = prefix_len + full_path_size - prefix_off;
-    result = (wchar_t*) os::malloc(sizeof(wchar_t) * (additional_space + result_size), mtInternal);
+    size_t result_buffer_size = sizeof(wchar_t) * (additional_space + result_size);
+    result = (wchar_t*) os::malloc(result_buffer_size, mtInternal);

     if (result == NULL) {
       err = ENOMEM;
     } else {
-      size_t converted_chars;
+      ZeroMemory(result, result_buffer_size);
       wchar_t* path_start = result + prefix_len - prefix_off;
-      err = ::mbstowcs_s(&converted_chars, path_start, buf_len + 1, buf, buf_len);
+      int win32_ret = MultiByteToWideChar(CP_THREAD_ACP, MB_ERR_INVALID_CHARS, buf, (int)buf_len, path_start, (int)(buf_len + 1));
+      err = (win32_ret == 0) ? EINVAL : ERROR_SUCCESS;

       if ((err == ERROR_SUCCESS) && needs_fullpath) {
         wchar_t* tmp = (wchar_t*) os::malloc(sizeof(wchar_t) * full_path_size, mtInternal);

@YaSuenag不,我没有。 感谢您的帮助。

我在jdk / jdk中修复了此问题,并将其反向移植到

此页面是否有帮助?
0 / 5 - 0 等级