网站/小程序/APP个性化定制开发,二开,改版等服务,加扣:8582-36016

大家好,本篇文章主要讲的是java调用相互依赖的dll的处理方法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

一、问题描述

最近在做一个功能时遇到java需要调用dll,并且dll有依赖关系,之前都是单独调用一个,其实调用dll的都是模板代码,本身没有太高的难度,主要是相互依赖的还是第一次碰见,特此记录一下并分享给需要的朋友参考。

二、处理办法

其中A是dll方法的入口,A依赖B,C,D,E,F,G五个dll,先定义接口继承StdCallLibrary ,编写加载各个dll的模板代码,需要依赖的都全部加载进来,我这儿是A依赖了B,C,D,E,F,G六个dll,所以我这里共写了六个接口,来分别加载不同的dll,主要是因为StdCallLibrary不支持加载多个dll,如果支持的话就不用写多个了,废话不多说直接上代码:

2.1 类定义

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
/**
 *
 * ClassName: DllLoadClass <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON(可选). <br/>
 * date: 2022年1月27日 下午5:08:21 <br/>
 *
 * @author 行则将至
 * @version
 */
public class DllLoadClass {

    /**
     *
     * ClassName: A <br/>
     * Function: TODO 加载A. <br/>
     * Reason: TODO ADD REASON(可选). <br/>
     * date: 2022年1月27日 下午5:08:58 <br/>
     *
     * @author 行则将至
     * @version DllLoadClass
     */
    public interface A extends StdCallLibrary {
        String dllName = "dllv2/A";
        A INSTANCE = Native.load(dllName,A.class);

        public String a(String inString);

    }
    /**
     *
     * ClassName: B <br/>
     * Function: TODO 加载B. <br/>
     * Reason: TODO ADD REASON(可选). <br/>
     * date: 2022年1月27日 下午5:09:27 <br/>
     *
     * @author 行则将至 
     * @version DllLoadClass
     */
    public interface B extends StdCallLibrary {
        String dllName = "dllv2/B64";
  
        B INSTANCE = Native.load(dllName,B.class);

    }

    /**
     *
     * ClassName: C <br/>
     * Function: TODO 加载C. <br/>
     * Reason: TODO ADD REASON(可选). <br/>
     * date: 2022年1月27日 下午5:09:41 <br/>
     *
     * @author 行则将至 
     * @version DllLoadClass
     */
    public interface C extends StdCallLibrary {
        String dllName = "dllv2/C64";
        C INSTANCE = Native.load(dllName,C.class);
    }

    /**
     *
     * ClassName: D <br/>
     * Function: TODO 加载D. <br/>
     * Reason: TODO ADD REASON(可选). <br/>
     * date: 2022年1月27日 下午5:09:50 <br/>
     *
     * @author 行则将至 
     * @version DllLoadClass
     */
    public interface D extends StdCallLibrary {
        String dllName = "dllv2/D64";   

        D INSTANCE = Native.load(dllName,D.class);
    }
     
    /**
     *
     * ClassName: E <br/>
     * Function: TODO 加载E. <br/>
     * Reason: TODO ADD REASON(可选). <br/>
     * date: 2022年1月27日 下午5:10:37 <br/>
     *
     * @author 行则将至 
     * @version DllLoadClass
     */
    public interface E extends StdCallLibrary {
        String dllName = "dllv2/E64";

        E INSTANCE = Native.load(dllName,E.class);
    }

    /**
     *
     * ClassName: F <br/>
     * Function: TODO 加载F. <br/>
     * Reason: TODO ADD REASON(可选). <br/>
     * date: 2022年1月27日 下午5:10:01 <br/>
     *
     * @author 行则将至 
     * @version DllLoadClass
     */
    public interface F extends StdCallLibrary {
        String dllName = "dllv2/F64";

        F INSTANCE = Native.load(dllName,F.class);
    }
    /**
     *
     * ClassName: G <br/>
     * Function: TODO 加载G. <br/>
     * Reason: TODO ADD REASON(可选). <br/>
     * date: 2022年1月27日 下午5:10:10 <br/>
     *
     * @author 行则将至 
     * @version DllLoadClass
     */
    public interface G extends StdCallLibrary {
        String dllName = "dllv2/G64";

        G INSTANCE = Native.load(dllName,G.class);
    }
   
}


2.2 调用 

上边虽然是定义出来了,那么怎么调用或者使用呢?调用其实也很简单,都定义出来了之后,其实就是需要咱们把依赖都加载进来即可,咱们仍然是直接上代码:

public class Test {
    @SuppressWarnings("unused")
    public static void main(String[] args) {
        B b = DllLoadClass.B.INSTANCE;
        C c = DllLoadClass.C.INSTANCE;
        D d = DllLoadClass.D.INSTANCE;
        F f = DllLoadClass.F.INSTANCE;
        G g = DllLoadClass.G.INSTANCE;
        A a = DllLoadClass.A.INSTANCE;
        String result = a.a("");
    }
}


原理就是调用一下成员变量,让其加载进来即可。 

三、结语

道阻且长,行则将至,行而不辍,未来可期,加油。

 


评论 0

暂无评论
0
0
0
立即
投稿
发表
评论
返回
顶部