Собственная библиотека Java System.loadLibrary завершается с ошибкой UnsatisfiedLinkError - PullRequest
3 голосов
/ 22 марта 2011

Я пытаюсь использовать встроенную библиотеку C ++ в Java.

Когда я загружаю ее с

System.loadLibrary(filename);

, я получаю сообщение об ошибке:

java.lang.UnsatisfiedLinkError: Разделитель каталогов не должен появляться в имени библиотеки: C: \ HelloWorld.dll

Есть идеи, как решить эту проблему?

Ответы [ 4 ]

4 голосов
/ 22 марта 2011

loadLibrary необходимо имя файла без пути и расширения.

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

См. java.lang.System API .

3 голосов
/ 22 марта 2011

Просто используйте:

System.loadLibrary("HelloWorld"); // without c:\ and without ".dll" extension

Также убедитесь, что HelloWorld.dll доступно в пути к вашей библиотеке.

0 голосов
/ 22 марта 2011

Удивительно, но также можно использовать следующее:

    final File dll = new File("src/lib/Tester32.dll");

    Test32 test32 = (Test32) Native.loadLibrary(dll.getAbsolutePath(), Test32.class);

    System.out.println(test32.toString() + " - " + test32.GetLastError());

Он выводит:

Proxy interface to Native Library <C:\workspace\jna\src\lib\Tester32.dll@387842048> - 0

Javadoc говорит:

loadLibrary

public static Object loadLibrary (String name, Class interfaceClass)

Сопоставить интерфейс библиотеки с указанной общей библиотекой, предоставив явный класс интерфейса.Если name равно null, выполняется попытка сопоставления с текущим процессом.

Если я переименую Tester32.dll в папке .\src\lib во что-то другое, произойдет следующее исключение:

Исключение в потоке "main" java.lang.UnsatisfiedLinkError: Невозможно загрузить библиотеку 'C: \ workspace \ jna \ src \ lib \ Tester32.dll': указанный модуль не найден.

0 голосов
/ 22 марта 2011

Я использовал JNA, чтобы сделать это ...

JNA - это простой способ вызова функций Native, которые он предоставляет класс NativeLibrary, полезный для решения этой задачи:

// Java-код для вызова нативной функции

dll = NativeLibrary.getInstance(Mydll);

Function proxy;

proxy = dll.getFunction(Utils.getMethods().get("MyMethodEntryPoint"));
        byte result[] = new byte[256];
        int maxLen = 250;
        String strVer = "";
        Object[] par = new Object[]{result, maxLen};
        intRet = (Integer) proxy.invoke(Integer.class, par);
        if (intRet == 0) {
            strVer = Utils.byteToString(result);
        }

документацию можно найти по адресу http://jna.java.net/

...