2010-03-29 3 views
9

Я пытаюсь загрузить DLL в java, используя следующий код: System.loadLibrary ("mydll");Загрузка DLL в Java - Eclipse - JNI

Проект размещен в D: \ development \ project \, и я разместил dll на D :. Затем я дал следующие действия VM аргумент в конфигурации затмения -Djava.library.path = D:/

Но когда я бегу я получаю UnsatisifiedLinkerError. После того, как вы немного поработали, я использовал System.load ("D: \ mydll.dll");

, но снова получая ту же проблему, может кто-то может помочь?

+0

Я проверил мой путь к классам с этим кодом System.getProperty («java.class.path») и разместила dll на этом конкретном пути. После этого я получаю сообщение об ошибке «Не могу найти зависимые библиотеки». Как я могу проверить, какие библиотеки он запрашивает: S. Я использую DLL третьей стороны. –

ответ

7

Если вы укажете имя DLL-файла в пути к библиотеке, опустите это. Кроме того, ваш вызов System.loadLibrary должен быть просто «mydll». Я могу сказать вам (по опыту), что если вы поместите DLL в корень вашего проекта в Eclipse (т. Е. D: \ Eclipse Workspace \ Proj), то должен работать. Любые дальнейшие ошибки компоновщика могут быть связаны с проблемами зависимостей при поиске других DLL. Исключением является то же самое. Используйте что-то вроде Dependency Walker (http://www.dependencywalker.com/), чтобы узнать, полагается ли ваша DLL на что-либо еще не на пути к системной библиотеке.

Edit: UnsatisfiedLinkError: Брошенный, если виртуальная машина Java не может найти подходящее определение на родном языке методы объявлена ​​родной - кажется, что вы используете функцию JNI, которой не существует.

3

Использование System.loadLibrary("mydll") прекрасно работает, вы также можете использовать его. Если вы использовали javah и вы думаете, с вашей DLL все нормально, есть два possibilies:

  1. Виртуальная машина Java не находит ваш DLL: В этом случае ваш Java путь к библиотеке не правильно (я сомневаюсь), и вы должны, вероятно, установить его на . и поместить свою DLL в текущую рабочую директорию.
  2. Виртуальная машина Java не находит DLL вашей DLL зависит от: Если у вас есть какие-либо зависимые библиотеки в вашей DLL, они НЕ искали в JVM, но сама Windows. И Windows не знает java.library.path, поэтому он будет выглядеть в системе PATH переменной для них. Если у вас есть такая возможность, вы можете установить переменную PATH в расположение ваших DLL, прежде чем запускать JVM, и все будет хорошо. Или вы можете загрузить все свои DLL с помощью JVM, как это

    System.loadLibrary ("dll_1");
    System.loadLibrary ("dll_2");
    System.loadLibrary ("dll_3");

    , где dll_3.dlldll_2.dll зависит от того, который зависит от dll_1.dll.

Надеюсь, что это поможет.

+0

Похоже, под linux эта концепция не работает как-то, кто-нибудь знает почему? – Zorkus

+0

Он должен был работать и под Linux. Какую библиотеку вы пытаетесь загрузить? –

0

@ alee- Вы можете просто скопировать и вставить DLL-файлы в папку system32 ваших окон и попытаться вызвать библиотеку через System.loadLibrary («mydll») ... я думаю, это может сработать ...

4

Проверьте правильность настройки нативных зависимостей here. Кроме того, убедитесь, что вы используете правильную JVM: в моем случае DLL не была найдена, потому что это была 32-разрядная DLL, но я использовал x64 JVM!

1

Поместите свой файл Almafa.dll в C:/Java/jre7/lib или/bin, извините, я не могу точно запомнить. После того, как вы сделали не больше конфигурации необходимо, просто сказать

static{ System.LoadLibrary("Almafa"); }

в классе, где вы хотите, чтобы загрузить его. Он работает только в Java-проекте, в Android, таком как проект, вам нужно использовать JNI. Я опубликовал сейчас результат 3 дней без сна :)

2

У вас есть одна проблема: System.load ("D: \ mydll.dll"); должен быть System.load ("D: \\ mydll.dll"); или System.load ("D: /mydll.dll");

У меня был больше успеха с System.load, но loadlibrary лучше разработан для мультиплатформы. Он определяет расширение для вас.

0

Дайте путь к библиотеке в проекте, как родное расположение библиотеки, кажется быть решенным.

0

я получил мою ошибку решена с помощью следующего:

static { 
    try { 
     System.loadLibrary("myDLL"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Вместо использования System.load("myDLL.dll")

Смежные вопросы