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

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

三、结语

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

原创不易,如果你觉得文章不错,对你的进步有那么一点帮助,那么就给个小心心,如果觉得文章非常对你的胃口,那么欢迎你关注我,或者关注个人的微信公众号,咱们一起打怪升级。
在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿每日分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值