Должен ли я помещать все зависимые DLL в папку JDK bin?
Мое приложение java зависит от DLL, а DLL далее зависит от libstdc++-6.dll
.
Я попытался:
- разместил
libstdc++-6.dll
в папке
- и поместите папку в папку% PATH%
Затем я встречаю java.lang.Unsatisfied LinkError: The specified procedure could not be found
при запуске приложения из Eclipse.
Но если я поставлю libstdc++-6.dll
в JDK bin folder
, скажем C:\Java\jdk1.6.0_45_32bit\bin
. Он отлично работает.
Но я не хочу загрязнять папку JDK. Я помню, что окна будут искать% PATH% для поиска зависимых DLL. Почему я не могу использовать% PATH% в этой проблеме?
Обновление 1
В Windows есть две переменные среды% PATH%.
- Пользовательские переменные
- Системные переменные
Я просто случайно обнаружил, что:
-
Если я поместил папку DLL в User% PATH%, ее не удалось найти.
-
Если я поместил папку DLL в System% PATH%, она будет работать.
Почему?
Обновление 2
Вдохновленный этой нитью: Системная переменная окружения PATH пользователя... winmerge работает, только если я добавлю путь к пользовательскому PATH
Я начинаю удивляться, может быть, мой пользователь% Path% слишком длинный. Поэтому я переместил путь к папке, содержащий мою зависимую DLL, из end пользователя% PATH% в начало . Он работает сейчас!
Сначала я пришел к выводу, что тот, кто реализовал алгоритм поиска DLL Windows, имеет некоторую проблему усечения. И я почти считаю это еще одним раздражающим Windows Bug.
Но я написал другое приложение Windows, которое имеет похожие DLL-зависимости, чтобы подтвердить мои предположения. Это приложение отлично работает! Поэтому я должен пересмотреть свое заключение.
Я проверил запись User% PATH% один за другим и поместил папку в каждое возможное место. И, наконец, я нахожу причину.
У меня есть запись C:\MinGW\bin
в User% PATH%, которая, как оказалось, содержит libstdc++-6.dll (977KB)
, но, к сожалению, это несовместимо с тем, который мне нужен (825KB)
. Он работает только в том случае, если я помещаю свою папку перед MinGW. Таким образом, это фактически столкновение DLL во время% PATH% разрешения.
Теперь эта проблема решена. Но возникает еще один вопрос: мне нужно переключаться туда и обратно, если я хочу использовать как свою DLL, так и MinGW?
Обновление 3
Пожалуйста, отметьте комментарий @AndyThomas. Он упомянул использование System.loadLibrary()
для прямых и непрямых DLL. Таким образом, все, о чем нам нужно заботиться, это свойство java.library.path
. Я думаю, что это решение раз и навсегда.
Ответы
Ответ 1
Сначала: поместите все файлы DLL в один каталог
Затем: Загрузка собственных libs - для этого у вас есть 3 варианта:
- Задайте параметры VM во время запуска приложения.
-Djava.library.path = "C:\Ваш каталог, где Dll присутствует"
Пример:
java -Djava.library.path = "C:\Ваш каталог, где Dll present" -jar app.jar
- Загрузите определенную собственную библиотеку из приложения:
a) Поместите каталог, содержащий файл aaa.dll, непосредственно в проект Java.
b) И поместите эту строку в начало трассировки стека вашего приложения: System.loadLibrary( "aaa" )
- Используйте параметры VM из вашего приложения:
System.setProperty( "java.library.path", "C:\Ваш каталог, где Dll настоящее" );