2009-06-22 4 views
1

Я написал несколько крючков JNI в библиотеку C++ и создал некоторые DLL-файлы для моего проекта java-сервера. Допустим, что DLL и баночка файлы находятся в той же папке под «C:/сервер»java, System.loadlibrary ("someDLLFile") получает неудовлетворенную ошибку ссылки

Я доступа к этим DLL файлы с помощью:

System.loadLibrary("someDLLFile"); 

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

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

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

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

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

+0

Имеет ли ваш коллега ту же версию ОС и версию Java, что и вы? –

+0

(Не то, чтобы я придумал ответ, но когда я не думаю, что знаю ответ, я соглашаюсь на получение дополнительной информации о вопросе.) –

+0

Включает ли ваш PATH «.». (текущий каталог)? –

ответ

4

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

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

1

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

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

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

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

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

А потом я просто загрузить каталог бен

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

    addDir(binPath); 

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

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

0

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