温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-02-05 11:02:20 来源:亿速云 阅读:338 作者:柒染 栏目:开发技术

这篇文章将为大家详细讲解有关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("");
    	}
    }

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

    关于java调用相互依赖的dll的处理方法是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI