java调用相互依赖的dll的处理方法

网友投稿 346 2022-08-31


java调用相互依赖的dll的处理方法

目录一、问题描述二、处理办法2.1 类定义2.2 调用三、结语

一、问题描述

最近在做一个功能时遇到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

* Function: TODO ADD FUNCTION.

* Reason: TODO ADD REASON(可选).

* date: 2022年1月27日 下午5:08:21

*

* @author 行则将至

* @version

*/

public class DllLoadClass {

/**

*

* ClassName: A

* Function: TODO 加载A.

* Reason: TODO ADD REASON(可选).

* date: 2022年1月27日 下午5:08:58

*

* @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

* FunctionCtwHkgh: TODO 加载B.

* Reason: TODO ADD REASON(可选).

* date: 2022年1月27日 下午5:09:27

*

* @author 行则将至

* @version DllLoadClass

*/

public interface B extends StdCallLibrary {

String dllName = "dllv2/B64";

B INSTANCE = Native.load(dllName,B.class);

}

/**

*

* ClassName: C

* Function: TODO 加载C.

* Reason: TODO ADD REASON(可选).

* date: 2022年1月27日 下午5:09:41

*

* @author 行则将至

* @version DllLoadClass

*/

public interface C extends StCtwHkghdCallLibrary {

String dllName = "dllv2/C64";

C INSTANCE = Native.load(dllName,C.class);

}

/**

*

* ClassName: D

* Function: TODO 加载D.

* Reason: TODO ADD REASON(可选).

* date: 2022年1月27日 下午5:09:50

*

* @author 行则将至

* @version DllLoadClass

*/

public interface D extends StdCallLibrary {

String dllName = "dllv2/D64";

D INSTANCE = Native.load(dllName,D.class);

}

/**

*

* ClassName: E

* Function: TODO 加载E.

* Reason: TODO ADD REASON(可选).

* date: 2022年1月27日 下午5:10:37

*

* @author 行则将至

* @version DllLoadClass

*/

public interface E extends StdCallLibrary {

String dllName = "dllv2/E64";

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

}

/**

*

* ClassName: F

* Function: TODO 加载F.

* Reason: TODO ADD REASON(可选).

* date: 2022年1月27日 下午5:10:01

*

* @author 行则将至

* @version DllLoadClass

*/

public interface F extends StdCallLibrary {

String dllName = "dllv2/F64";

F INSTANCE = Native.load(dllName,F.class);

}

/**

*

* ClassName: G

* Function: TODO 加载G.

* Reason: TODO ADD REASON(可选).

* date: 2022年1月27日 下午5:10:10

*

* @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("");

}

}

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

三、结语

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python基础(part17)--函数式编程
下一篇:python基础(part16)--生成器
相关文章

 发表评论

暂时没有评论,来抢沙发吧~