Мое приложение 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
. Я думаю, что это решение раз и навсегда.