Загрузка DLL в Java - Eclipse - JNI - PullRequest
11 голосов
/ 29 марта 2010

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

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

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

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

Ответы [ 9 ]

8 голосов
/ 29 марта 2010

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

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

4 голосов
/ 23 июля 2011

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

3 голосов
/ 04 апреля 2014

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

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

3 голосов
/ 29 марта 2010

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

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

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

    , где dll_3.dll зависит от dll_2.dll, что зависит от dll_1.dll.

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

1 голос
/ 29 июля 2012

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

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

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

0 голосов
/ 17 января 2018

Я исправил ошибку, используя следующее:

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

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

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

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

0 голосов
/ 07 августа 2014

System.loadLibrary загружает DLL из пути JVM (путь бина JDK).

Если вы хотите загрузить явный файл с путем, используйте System.load ()

См. Также: Разница между System.load () и System.loadLibrary в Java

public class MyClass
{
    static 
    {
        System.load("MyJNI.dll");
    }
}
0 голосов
/ 05 мая 2010

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

...