Должен ли я помещать все зависимые 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

  1. Загрузите определенную собственную библиотеку из приложения:

a) Поместите каталог, содержащий файл aaa.dll, непосредственно в проект Java.

b) И поместите эту строку в начало трассировки стека вашего приложения: System.loadLibrary( "aaa" )

  1. Используйте параметры VM из вашего приложения:

System.setProperty( "java.library.path", "C:\Ваш каталог, где Dll настоящее" );