Java, System.loadlibrary (& # 8220; someDLLFile & # 8221;) получает ошибку неудовлетворенной ссылки

StackOverflow https://stackoverflow.com/questions/1029559

Вопрос

Я написал несколько хуков JNI в библиотеку C ++ и создал несколько DLL-файлов для своего проекта на сервере Java. Допустим, файлы DLL и jar находятся в одной папке в разделе «C: / server»

Я обращаюсь к этим DLL-файлам, используя:

System.loadLibrary("someDLLFile");

в классе, который нуждается в коде C ++.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю этот сервер на своем собственном компьютере, все работает отлично, независимо от того, где я размещаю " сервер " папка. Но когда я отдаю его коллеге для проверки, они постоянно получают:

java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path

Я хочу, чтобы файлы DLL находились в той же папке, что и файлы jar, и предпочел бы, чтобы кто-то не настраивал их переменную PATH.

Почему System.loadLibrary () работает на моем собственном компьютере независимо от местоположения папки, но не на другом компьютере?

Это было полезно?

Решение

Это работает, потому что DLL (или DLL, от которой она зависит, то есть msvcr90.dll или что-то еще) находится в PATH на вашем компьютере, но не на другом.

Либо установите PATH env-var или свойство java.library.path, чтобы оно содержало каталог с вашим файлом, либо сохраните свою dll в том месте, где java находит ее по умолчанию (здесь много опций, в зависимости от стратегии развертывания и платформы).

Другие советы

Один из вариантов - указать каталог в командной строке при запуске виртуальной машины:

java -classpath C:\server -Djava.library.path=C:\server somePackage.Main

Другой вариант - использовать System.load вместо System.loadLibrary .

URL url = Test.class.getResource("someDLLFile.dll");
String f = new File(url.getFile()).getAbsolutePath();
System.load(f);

Недостатком является то, что ваша программа теперь имеет дело с зависимыми от платформы именами каталогов, расширениями файлов и т. д.

Я не уверен, полезно это или нет, но я включил следующее в некоторые проекты:

http://forums.sun.com/thread.jspa?threadID=707176

Для загрузки собственных библиотек.

А потом я просто загружаю каталог bin

    String binPath = new File(".").getAbsolutePath() 
                     + System.getProperty("file.separator") + "bin";

   addDir( binPath );

Это работает довольно хорошо.

Но опять же, я не уверен, так ли это на самом деле.

Попытайтесь загрузить файл download.exe, чтобы узнать, зависит ли DLL от других библиотек в системе. Если это так, то проверьте другой компьютер, присутствуют ли такие библиотеки в Path или нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top