Temurin-build: Karakter bahasa China di jalur ke java.exe menyebabkan kesalahan "Tidak dapat memuat pustaka asli"

Dibuat pada 27 Jan 2020  ·  8Komentar  ·  Sumber: adoptium/temurin-build

Platform &: Arsitektur:
Windows10.0.18362
OpenJDK11U-jre_x64_windows_hotspot_11.0.6_10.zip
OpenJDK11U-jre_x86-32_windows_hotspot_11.0.6_10.zip

Langkah-langkah untuk mereproduksi masalah:

  1. Unduh JRE yang dijelaskan di atas dari https://adoptopenjdk.net/releases.html
  2. Buka ritsletingnya.
  3. Ubah nama "jdk-11.0.6 + 10-jre" menjadi "jdk 漢字 含 む" ("漢字 含 む" adalah 4 karakter Cina)
  4. Jalankan java.exe sebagai berikut:
$ 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 tidak menyebabkan kesalahan.
Terima kasih untuk binari Anda.

jdkissue2

Reported to OpenJDK / JBS bug

Komentar yang paling membantu

Saya memperbaiki masalah ini di jdk / jdk , dan juga melakukan backport ke jdk / jdk11u-dev . Ini akan dikirim dalam 11.0.8. Saya kira Anda dapat menggunakan AdoptOpenJDK 11 di jalur CJK sejak 11.0.8.

Semua 8 komentar

Sepertinya sama dengan karakter Korea

Dilaporkan oleh pengguna di aplikasi saya, jlink build dengan jdk-11.0.6 + 10
image

Skrip peluncuran pada gambar

<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  %*

Sunting: Juga diuji dengan 11.0.5, konfirmasi berfungsi

@ himawari-san Bisakah Anda mencoba 11.0.6 dari adoptopenjdk.net/upstream.html?

@arianna Saya mendapat kesalahan yang sama.
Terima kasih atas dukunganmu.

openjdk_ss

Saya pikir ini adalah bug di hulu. Saya mengonfirmasi masalah ini pada sumber jdk / jdk saat ini. Ini akan terjadi di jalur mana pun yang berisi karakter CJK.

Saya dapat memperbaikinya dengan tambalan seperti di bawah ini, jadi saya ingin mengirim permintaan ulasan untuk hotspot-runtime-dev di OpenJDK. Pernahkah Anda bekerja untuk itu di komunitas OpenJDK? Jika tidak demikian, saya akan mengajukannya ke 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 Tidak, saya belum. Saya menghargai bantuan Anda.

Saya melaporkan masalah ini ke JBS, dan mengirim permintaan tinjauan ke hotspot-runtime-dev.

https://bugs.openjdk.java.net/browse/JDK-8240197
https://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2020-February/038330.html

Saya memperbaiki masalah ini di jdk / jdk , dan juga melakukan backport ke jdk / jdk11u-dev . Ini akan dikirim dalam 11.0.8. Saya kira Anda dapat menggunakan AdoptOpenJDK 11 di jalur CJK sejak 11.0.8.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat