Java调用dll - UnsatisfiedLinkError 异常

本文介绍了在Java程序中调用DLL文件时遇到的UnsatisfiedLinkError异常及其解决方法。详细分析了两种异常情况:“noxxxinjava.library.path”及“xxx.class.function()Z”,并给出了具体的解决步骤。

#编者注 由于需求需要添加一个USB狗,作为服务的license验证。则Java程序需要和dll进行整合。该USB狗已经提供了Java版本的dll,需要自己编写class,载入dll,并声明方法才能够使用。如下内容就是在测试代码调用dll时发生的异常,以及处理方式。

#UnsatisfiedLinkError 异常 ##异常:no xxx in java.library.path 当我们按照如下方式进行编写的时候,假设loadLibrary没有dll文件。

public class UsbDog {

    static {
        System.out.println(System.getProperty("user.dir"));
        System.loadLibrary("lib//123//UT8K_JavaDll");
        System.out.println("dll load done.");
    }
}

则会发生如下异常,表示没有找到dll文件

Exception in thread "main" java.lang.UnsatisfiedLinkError: no lib//123//UT8K_JavaDll in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	at java.lang.System.loadLibrary(System.java:1122)
	at com.hava.usb.UsbDog.<clinit>(UsbDog.java:10)
	at com.hava.test.TestMain.main(TestMain.java:20)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

解决:在static代码段中添加Java所运行的目录,把dll放置到非全局环境中。

##异常:xxx.class.function()Z 该异常仅仅只报告了异常,并说明function名称,这让编者很是困惑。

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.hava.usb.UsbDog.InitiateLock(J)Z
	at com.hava.usb.UsbDog.InitiateLock(Native Method)
	at com.hava.usb.UsbDog.checked(UsbDog.java:89)
	at com.hava.test.TestMain.main(TestMain.java:20)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

通过资料查找,首先能够确定的是,发生这样的异常dll是被正确加载进来。才会报该异常内容。
其次,该异常是由于声明类,并没有按照dll当中的要求的package路径进行编写。修改成package相同,类名相同就可以正常运行了。

public class UT_DLL {

    static {
        System.out.println("[path]:" + System.getProperty("user.dir"));
        System.out.println("DLL loading...");
        System.loadLibrary("lib//UT8K_JavaDll");
        System.out.println("DLL Done.");
    }

    public native static boolean  InitiateLock(long uSerial);

    public native static boolean Lock32_Function(long l, long[] longs, long l1);

}

转载于:https://my.oschina.net/hava/blog/784791

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值