2011-01-30 55 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