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