本文共 2036 字,大约阅读时间需要 6 分钟。
很久没有上来写博客了,今天终于搞定了如何调用使用java调用dll,网上千篇一律的全是将dll放置到JDK底下,通过环境变量来加载,使用System.loadlibrary()。考虑到可能设计项目的迁移,其他机子可能缺少一些dll文件,以及还需要配置环境变量,着实不方便。博主这里给出通过使用类似于加载文件的方式,来加载dll。其实加载dll和加载文件是一样的。我们再使用dll里的方法的时候,其实是先加载dll,然后通过java调用里面的native方法。好了,废话不说,开始上例子。
一、确定你的dll是否依赖其他dll
当你通过java调用dll时,如果出现了:Can’t find dependent libraries很可能就是你的dll依赖于其他的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,好吧,再使用那个软件,检查它缺少的依赖:
成功了!!!
三、通过设置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");
就可以了!!
有什么不明白的,可以留言,我也是自己琢磨的,尽量帮助吧!