Java, System.loadlibrary ("someDLLFile") получает неудовлетворенную ошибку ссылки - PullRequest
1 голос
/ 23 июня 2009

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

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

System.loadLibrary("someDLLFile");

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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 23 июня 2009

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

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

1 голос
/ 23 июня 2009

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

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);

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

0 голосов
/ 12 ноября 2015

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

0 голосов
/ 23 июня 2009

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

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

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

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

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

   addDir( binPath );

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

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

...