博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java webservice 调用自定义dll(有其他依赖)方法全解,无需设置环境变量
阅读量:2352 次
发布时间:2019-05-10

本文共 2036 字,大约阅读时间需要 6 分钟。

终于搞定java中调用dll

很久没有上来写博客了,今天终于搞定了如何调用使用java调用dll,网上千篇一律的全是将dll放置到JDK底下,通过环境变量来加载,使用System.loadlibrary()。考虑到可能设计项目的迁移,其他机子可能缺少一些dll文件,以及还需要配置环境变量,着实不方便。博主这里给出通过使用类似于加载文件的方式,来加载dll。其实加载dll和加载文件是一样的。我们再使用dll里的方法的时候,其实是先加载dll,然后通过java调用里面的native方法。好了,废话不说,开始上例子。

一、确定你的dll是否依赖其他dll

当你通过java调用dll时,如果出现了:Can’t find dependent libraries很可能就是你的dll依赖于其他的dll,通过使用如下软件
,可以查看到缺失哪些依赖,在加载这些依赖的时候,从下到上加载:
这里写图片描述
例如我现在有一个CPlusMethod.dll,我在加载的时候,报上面的错,通过这个软件,我可以找到依赖的几个dll:
这里写图片描述
所以我依次查找这几个dll,其中最后可以在system32里找到,这里缺失的原因是,我没有将该dll放置在环境变量设置的路径下。

二、通过读取文件的方式读取dll

博主是建立了一个java web项目,使用maven来维护jar包的,在resource下建立了一个dll文件夹,主要目的是希望在打成war的时候,可以将这些dll也带进去。然后通过获取项目根目录的形式,来加载文件,还是以CPlusMethod为例子,我找到了这四个dll。
这里写图片描述

然后加载这些dll,按照从下到上的顺序加载这些dll

public class CPlusMethod {
/** * @Title: CPlusMethod * @Description: TODO 参数类型 */ public CPlusMethod() { String path = CPlusMethod.class.getResource("/dll").getPath(); System.out.println(path); System.load(path+"/kernel32.dll"); System.load(path+"/msvcr110.dll"); System.load(path+"/msvcp110.dll"); //System.load(path+"/msvcr110d.dll");//opencv依赖这个dll //System.load(path+"/msvcp110d.dll");//opencv依赖这个dll System.load(path+"/opencv_core244d.dll"); System.load(path+"/CPlusMethod.dll"); }}

然后通过一个测试类,来加载一下,这里因为涉及到博主正在做的项目,一些细节不便贴出来。发现还是报错,但是此时报的错误是opencv_core244d.dll Can’t find dependent libraries,好吧,再使用那个软件,检查它缺少的依赖:

这里写图片描述
因为博主已经安装了VS2012,缺少的这两个dll已经存在于博主的电脑里,通过环境变量加载,所以这里不显示缺失,但是在没有安装VS2012的机子上, 势必会出现缺少,这里黄色的那些都是缺失的。现在将这些dll都加载进来,完整的能跑起来的项目结构:
这里写图片描述
这里写图片描述
测试:
这里写图片描述

成功了!!!

三、通过设置build path来加载

也可以通过设置build path来加载,但是这样当打包成war的时候,这些dll不会带进去,这种方式其实是不设置环境变量的一种方式,治标不治本,这里也贴出来
比如我现在的dll放在src/dll下,那么我通过设置build path中的动态链接库

这里写图片描述

然后通过使用

//注意,这里直接加载dll名称就行,连路径都不要        System.loadLibrary("kernel32");        System.loadLibrary("msvcr110");        System.loadLibrary("msvcp110");        System.loadLibrary("msvcr110d");        System.loadLibrary("msvcp110d");        System.loadLibrary("opencv_core244d");        System.loadLibrary("CPlusMethod");

就可以了!!

有什么不明白的,可以留言,我也是自己琢磨的,尽量帮助吧!

你可能感兴趣的文章
八大基础排序总结
查看>>
Linux下安装使用FastDFS
查看>>
后台管理系统之品牌管理
查看>>
后台管理系统之商品规格管理
查看>>
后台管理系统之商品管理
查看>>
商品详情及Thymeleaf静态化
查看>>
如何安装最纯净的Windows系统,玩转重装操作系统
查看>>
RabbitMQ安装使用及数据同步
查看>>
用户中心
查看>>
授权中心
查看>>
乐优商城—购物车
查看>>
乐优商城—订单微服务
查看>>
《剑指offer》思路与实现总结--Java
查看>>
字符串数组转成矩阵
查看>>
VC++ UDP转TCP互发数据 UDP为服务端 TCP为客户端 可修改IP和端口最小化 2TCP/UDP中转
查看>>
仿养生网 帝国CMS 更新后域名栏目链接一直没变 解决方法:在后台地图--模板标签替换里直接全部替换
查看>>
微信扫码自动群发消息给所有人技术分析 之通过https请求获取微信网页版登录二维码图
查看>>
C#源码刷新网页 最小化托盘http get和post请求配置保存版权时间限制定时调用 单实例运行,如果已经运行则激活窗口到最前显示
查看>>
域名解密 商家联盟会员消费管理系统_连锁店会员积分系统 带微信(域名加密的) aqinxiaodian
查看>>
android蓝牙4.0BLE及2.0 2.1 apk 串口助手带16个自定义按键和自定义指令 字符接收 十六进制或字符发送
查看>>