2011-01-30 14 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 2011-01-30 09:02:19

+0

贏?你的意思是Windows?啊,對不起,不支持遺留系統:) – 2011-01-30 16:43:43

0

要麼usb.dll無法找到,嘗試系統.load()與一個abbsolute路徑而不是System.loadLibrary()來驗證這一點。

另一個問題可能是,是的libusb依賴於其他DLL。使用Dependency Walker可以查看哪些DLL由libusb引用。

另一個問題可能是,該DLL不導出函數與corrent簽名。 DLL中應該有一個USBManager_usb_init()函數。使用javah創建正確的簽名。

0

JNI相當簡約,jni訪問的任何函數都需要一個針對您的類編寫的本機包裝函數。工具javah生成一個包含所需包裝器的頭文件。

訪問本地功能最簡單的方式使用JNA