Java DLL链接错误

我正在使用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();     
    } 
}
    
已邀请:
你不能只使用公共本地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();
}
Sun开发人员在博客上有一个非常好的简单示例,但还有很多其他示例。     
这个库的Java包装器已经编写完成了。你为什么不试试呢?     
试试
System.loadLibrary("usb");
    
无法找到usb.dll,请尝试使用abbsolute路径而不是System.loadLibrary()的System.load()来验证这一点。 另一个问题可能是,libusb依赖于其他DLL。使用Dependency Walker查看libusb引用了哪些DLL。 另一个问题可能是,DLL不会导出具有相关签名的函数。 DLL中应该有一个USBManager_usb_init()函数。使用
javah
创建正确的签名。     
JNI相当简约,jni访问的任何函数都需要针对您的类编写的本机包装函数。 javah工具生成一个包含所需包装器的头文件。 要访问本机函数,可以轻松使用JNA。     

要回复问题请先登录注册