Java DLL链接错误

时间:2011-01-30 07:02:45

标签: java dll linker usb libusb

我使用的是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();     
    } 
}

5 个答案:

答案 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轻松访问本机功能。