Ошибка загрузки DLL при использовании System.loadLibrary () - PullRequest
3 голосов
/ 07 марта 2012

Я создаю программу, использующую JNI для вызова некоторых собственных директив. Мой код: System.loadLibrary("poc_NativeShellExecutor");

Когда я запускаю код, я получаю исключение:

Caused by: java.lang.UnsatisfiedLinkError: no poc_NativeShellExecutor in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:845) at java.lang.System.loadLibrary(System.java:1084)

Я проверяю java.library.path, и я уверен, что я помещаю poc_NativeShellExecutor.dll в C: \ Windows \ System32. Вот некоторая информация о моей системе:

Java version: 1.7.0_03, vendor: Oracle Corporation
Java home: E:\Program Files (x86)\Java\jdk1.7.0_03\jre
Default locale: en_US, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "x86", family: "windows"

Не могли бы вы помочь мне?

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Это не решение, а дополнительные данные, которые, я надеюсь, могут помочь найти их.

У меня та же проблема, что и у ОП.

Моя система Windows7 Ultimate x64 SP1.
Я запускаю свой 32-битный test_x86.dll, используя 32-битный jvm 1.6.0_29.

Я пытался поместить test_x86.dll в следующие папки:

C:\
C:\Windows
C:\Program Files (x86)

и это работает: мой test_x86.dll успешно загружен.

Но если я помещу свою DLL в

C:\Windows\System32

Я получаю исключение:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no test_x86 in java.library.path

Я каждый раз меняю java.library.path перед тем, как пытаться загрузить dll, поэтому он всегда начинается с соответствующей директории:

java.library.path = C:/;C:\Program Files (x86)\Java\jre6\bin; ...
java.library.path = C:/Windows;C:\Program Files (x86)\Java\jre6\bin; ...
java.library.path = C:/Program Files (x86);C:\Program Files (x86)\Java\jre6\bin; ...
java.library.path = C:/Windows/System32;C:\Program Files (x86)\Java\jre6\bin; ...

Я также попытался использовать значение по умолчанию java.library.path (которое содержит C:\Windows\System32 по умолчанию) с test_x86.dll в C:\Windows\System32. Не повезло: это также приводит к исключению выше.

У меня всегда есть одна копия test_x86.dll в папках, которые находятся в java.library.path, т. Е. Только одна из папок содержит этот файл одновременно.

Вывод:

Кажется, что в Windows 7 x64 C:/Windows/System32 имеет некоторые хитрые ограничения.

Раньше на моей 32-битной машине с Windows XP я никогда не думал об изменениях в папке C:\Windows\System32 и java.library.path. Я просто использовал System.loadLibrary("test_x86"); вызов с test_x86.dll в этой папке, и он всегда работал.

1 голос
/ 23 января 2017

Если вы ссылаетесь на C: \ Windows \ System32 в 64-битной Windows из 32-битного приложения, Windows фактически выполняет поиск в C: \ Windows \ SysWOW64.Вам нужно было бы разместить там dll для 32-битных приложений.

...