Я могу загружать собственные библиотеки по короткому пути к файлу:
Код: Выделить всё
System.load("C:\\msvcp140.dll") // works
Код: Выделить всё
System.load("\\\\?\\C:\\msvcp140.dll") // Exception:
| Exception java.lang.UnsatisfiedLinkError: Can't load library: \\?\C:\msvcp140.dll
| at ClassLoader.loadLibrary (ClassLoader.java:2398)
| at Runtime.load0 (Runtime.java:755)
| at System.load (System.java:1957)
| at (#1:1)
Код: Выделить всё
Exception java.lang.UnsatisfiedLinkError: C:\q72\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_lon
g_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_lon
g_long_long_long_\long_long_long_long_long_long_long_long_long_long_\msvcp140.dll: The filename or extension is too long
- Взлом реестра:
Код: Выделить всё
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem] "LongPathsEnabled"=dword:00000001 - Групповая политика\Политика локального компьютера\Конфигурация компьютера\Административные шаблоны\Система\Файловая система\Включить длинные пути Win32
Я еще не пробовал:
- Символическое связывание файлов во временный каталог, так как этот подход весьма подвержен ошибкам (из-за очистки, которая смехотворно сложна в Windows с ее политикой удаления открытых файлов).
- Определение переменной среды PATH и использование System.loadLibrary(), потому что ChatGPT заявил, что не решит внутренние проблемы Проблема с API. Это сработает для меня, потому что, хотя путь установки является динамическим, я имею полный контроль над запуском приложения и могу переопределить среду.
Я заметил, что C:\Windows\System32\cabapi.dll и C:\Program Файлы\Google\Chrome\Application\145.0.7632.45\libEGL.dll загружаются нормально при копировании в глубоко вложенный каталог. Но C:\Program Files\Google\Chrome\Application\145.0.7632.45\dxil.dll этого не делает. Таким образом, поведение зависит от библиотеки!
Вот тестовый сценарий (прочитайте выходные данные, чтобы определить, где произошла ошибка, jshell всегда возвращает нулевой код выхода):
Код: Выделить всё
function loadFromPath {
param (
[Parameter(Mandatory=$true)]
[System.IO.FileInfo]$origin,
[Parameter(Mandatory=$true)]
[string]$target
)
$null = New-Item -ItemType Directory -Path ($target | Split-Path) -Force
Copy-Item $origin $target
$escaped = $target.Replace('\', '\\')
$javaBlock = @"
var lib = "\\\\?\\$escaped";
System.out.println("Loading " + lib);
System.load(lib);
"@
Write-Host $origin
$javaBlock | jshell -s -
}
$root = 'C:\longTest\'
function loadShortAndLong {
param (
[Parameter(Mandatory=$true)]
[System.IO.FileInfo]$origin
)
$longPath=$root + $( $("long_" * 10 + "\") * 10) + 'test.dll'
$shortPath=$root + 'test.dll'
loadFromPath $origin $shortPath
loadFromPath $origin $longPath
}
loadShortAndLong 'C:\Program Files\Google\Chrome\Application\145.0.7632.45\libEGL.dll'
loadShortAndLong 'C:\Program Files\Google\Chrome\Application\145.0.7632.45\dxil.dll'
Remove-Item $root -Recurse -Force
В чем разница между dxil.dll и libEGL.dll?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -long-path
Мобильная версия