2011-01-30 3 views

ответ

2

Вы не можете использовать общедоступный пользовательский 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(); 
} 

Существует довольно хороший простой пример на a blog by a Sun developer, но есть много других примеров там.

0

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

+0

Это победа, а не Linux. В linux и в общей библиотеке под названием «libabc.so» ссылается «abc», на win «libabc.dll» ссылается «libabc». – Daniel

+0

Выиграть? вы имеете в виду Windows? Ах, извините, не поддерживая устаревшие системы :) –

0

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

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

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

3

Существует Java wrapper for this library, что было написано. Почему бы вам не попробовать?

+0

Coola, я не знал, что для библиотеки была java-обложка. Это делает вещи приятными и удобными для использования – Petesh

0

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

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

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