java 加载dll 异常,包含调试运行和打jar

java 加载dll 异常,包含调试运行和打jar

jna加载DLL

java加载dll,目前用的方式就是Native.loadLibrary,或者高版本一点的是Native.load,都差不多,不过大家应该都遇到的问题了,用idea运行时,没任何问题,但是打出来的jar就出问题了。可能大家都会打开jar看看里面有没有这个dll资源,作者用的是gradle,jar里面确实是有xx.dll的,但是运行jar之后就异常退出了。百度说可以拷贝到system32下,但是个人不喜欢,就是不想人工干预。

1、单个dll加载

如果Native.loadLibrary 加载的dll只有一个,也就是说,这个dll不依赖其他的dll,可以用以下方式:在这里插入图片描述

建固定的文件夹名称 win32-x86 和 win32-x86-64,分别放32位和64位的dll,用Native.loadLibrary加载就可以,无论是idea运行还是jar运行都可以的

2、多个dll依赖

也就是加载一个dll,但是这个dll还依赖了其他的dll,
使用Native.loadLibrary,加载箭头的dll,在idea中没问题,但是运行jar就挂了。
在这里插入图片描述

这里作者引入 DllUtils.java,调用DllUtils.loadDll(“lib/xx/xxx.dll”, clazz);就可以工作,主要逻辑是把jar里面的dll拷贝出来和jar的同级下

public synchronized static Object loadDll(String libName, Class<?> className) {
		try{
			return Native.loadLibrary(libName, className);
		}catch (Throwable ex){ }
		String pathname = System.getProperty("user.dir") + File.separator + libName;
		File file = new File(pathname);
		if (!file.exists()) {
			File libFile = new File(libName);
			try {
				loadRecourseFromJarByFolder(File.separator + libFile.getParent(), System.getProperty("user.dir") ,DllUtils.class);
			} catch (Exception e) {
				log.info("复制DLL文件异常:", e);
			}
		}
		
		File file1 = new File(pathname);
		if (!file1.exists()) {
			pathname = libName;
		}
		return Native.loadLibrary(pathname, className);
	}

但是这个工具还有不足的地方,没有适配加载resources根下的dll,要用的朋友自己改下吧,作者比较懒,
附下代码的下载地址
https://download.csdn.net/download/ADdhtfdhdg/12881997

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值