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 
* 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
* Function: 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 StdCallLibrary { 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("");
	}
}

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

三、结语

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

到此这篇关于java调用相互依赖的dll的处理方法的文章就介绍到这了,更多相关java相互依赖的dll内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(java调用相互依赖的dll的处理方法)