我使用的是libusb-- http://sourceforge.net/apps/trac/libusb-win32/wiki
但是,我得到了:
线程“main”中的异常 java.lang.UnsatisfiedLinkError中: USBManager.usb_init()V
public class USBManager
{
static{
System.loadLibrary("libusb");
}
native void usb_init();
public USBManager()
{
usb_init();
}
}
答案 0 :(得分:3)
已经写了Java wrapper for this library。你为什么不试试呢?
答案 1 :(得分: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'的函数,它接受指定的to参数。
这个功能只不过是:
JNIEXPORT void JNICALL Java_USBManager_usb_1init (JNIEnv *, jobject) {
usb_init();
}
a blog by a Sun developer上有一个非常好的简单例子,但还有很多其他例子。
答案 2 :(得分:0)
尝试System.loadLibrary("usb");
答案 3 :(得分:0)
无法找到usb.dll,请尝试使用abbsolute路径而不是System.loadLibrary()的System.load()来验证这一点。
另一个问题可能是,libusb依赖于其他DLL。使用Dependency Walker查看libusb引用了哪些DLL。
另一个问题可能是DLL没有使用相关签名导出函数。 DLL中应该有一个USBManager_usb_init()函数。使用javah
创建正确的签名。
答案 4 :(得分:0)
JNI相当简约,jni访问的任何函数都需要针对您的类编写的本机包装函数。 javah工具生成一个包含所需包装器的头文件。
要使用JNA轻松访问本机功能。