java调用带异步的dll_Java调用dll - UnsatisfiedLinkError 异常

本文介绍了在Java程序中调用DLL时遇到的两种UnsatisfiedLinkError异常及其解决方案。一种是由于DLL文件路径不正确导致,解决办法是在静态代码块中指定正确路径;另一种是由于类名和DLL中定义的包名不匹配,修正为相同即可正常运行。
摘要由CSDN通过智能技术生成

#编者注 由于需求需要添加一个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.(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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值