Java webservice 调用自定义dll(有其他依赖)方法全解,无需设置环境变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BuptZhengChaoJie/article/details/52421406

终于搞定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,通过使用如下软件http://download.csdn.net/detail/buptzhengchaojie/9620595
,可以查看到缺失哪些依赖,在加载这些依赖的时候,从下到上加载:
这里写图片描述
例如我现在有一个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");

就可以了!!

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

猜你喜欢

转载自blog.csdn.net/BuptZhengChaoJie/article/details/52421406
今日推荐