Java调用dll

末鹿安然 提交于 2019-12-26 20:30:16

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!