Ошибка связывания Java DLL - PullRequest
4 голосов
/ 30 января 2011

Я использую libusb-- http://sourceforge.net/apps/trac/libusb-win32/wiki

Тем не менее, я получаю:

Исключение в потоке "main"

public class USBManager 
{   
    static{
        System.loadLibrary("libusb");   
    }

    native void usb_init();
    public USBManager()
    {       
        usb_init();     
    } 
}

Ответы [ 5 ]

3 голосов
/ 30 января 2011

Для этой библиотеки уже написана Java-оболочка. Почему бы тебе не попробовать это?

2 голосов
/ 30 января 2011

Вы не можете просто использовать public public usb_init ();и затем загрузить собственную библиотеку, подобную этой, JNI не реализован таким образом.

вы используете javah для создания файла .h, который можно использовать для создания библиотеки, которая реализует определенные собственные функции в классе.

javac USBManager

Создает файл класса, который вы используете с javah:

javah USBManager

Это дает файл в этом месте с именем «USBManager.h», который определяет функции для реализации в.so / .dll, которые реализуют соответствующую встроенную функцию.

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class USBManager */

#ifndef _Included_USBManager
#define _Included_USBManager
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     USBManager
 * Method:    usb_init
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_USBManager_usb_1init
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

Таким образом, вам необходимо экспортировать функцию с именем 'Java_USBManager_usb_1init', которая принимает указанные параметры.

Эта функция можетбыть не более чем:

JNIEXPORT void JNICALL Java_USBManager_usb_1init (JNIEnv *, jobject) {
    usb_init();
}

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

0 голосов
/ 30 января 2011

JNI довольно минималистичен, любая функция, к которой обращается jni, требует встроенной функции-обертки, написанной для вашего класса.Инструмент javah генерирует заголовок, содержащий необходимые оболочки.

Для доступа к нативным функциям проще всего использовать JNA .

0 голосов
/ 30 января 2011

Либо usb.dll не может быть найден, попробуйте System.load () с абсолютным путем вместо System.loadLibrary (), чтобы проверить это.

Другая проблема может заключаться в том, что libusb зависит отбиблиотеки DLL.Используйте Dependency Walker , чтобы увидеть, на какие DLL ссылается libusb.

Другая проблема может заключаться в том, что DLL не экспортирует функцию с соответствующей подписью.В DLL должна быть функция USBManager_usb_init ().Используйте javah для создания правильной подписи.

0 голосов
/ 30 января 2011

Попробуйте System.loadLibrary("usb");

...