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 <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的处理方法的文章就介绍到这了,更多相关java相互依赖的dll内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java调用明华RF读写器DLL文件过程解析

    这篇文章主要介绍了Java调用明华RF读写器DLL文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先jdk必须得是32位的,IDE也必须是32位的(我用的idea,所以为了使用32位的,下载了2018年1月版本的). 明华RF读写器演示文件提供了一份名为mwrf32.dll的动态链接库文件 java如果想要调用的话,就必须使用JNI或者JNA的方式,毕竟跨语言了 首先在pom.xml文件中空白地方,右键选择Dependency,在

  • Java调用.dll文件的方法

    下截JNative组件 jnative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2 解压JNative-<st1:chsdate isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.3.2</st1:chsdate>.zip 获得三个文件,分别是:

  • Java通过JNI 调用动态链接库DLL操作

    JNI(Java Native Interface)Java本地接口,主要作用是实现java代码与C.C++编写的代码交互. 在Android编程中,so库的访问也用到了jni技术. 理论多说无益,还是看java连接dll的实战吧.如下: 例:java中调用demo.dll文件中的 hello()方法. 1.java 1)装载dll文件 有两种方式System.load();和System.loadLibrary(); load需要全路径且需要有文件扩展名: loadLibrary是特定路径,系

  • java调用dll方法总结

    常用的就是jni,jnative(基于jni封装了自己的jar包) 注意:java调用dll,必须dll里做了对应的处理.列如:方法名必须为_java_包名_类名_方法名 使用JNI调用dll步骤 新建一个java项目,将dll文件放入src下 配置改项目环境jre下native目录,指向src 项目jdk一定不要用eclipse自带的,用自己安装的jdk路径 按照dll里的目录顺序新建目录及类 声明跟dll里一样的方法,方法前加native关键字(注意参数类型) 代码静态块里写(不要后缀):

  • 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# 调用C++写的dll的实现方法

    dll的编写,首先是打开VS新建一个C++的控制台程序,下一步后选择dll以及空文档即可.然后就是添加一个类添加一个方法.方法排头固定格式 extern"C"__declspec(dllexport) 后面加方法即可. 例如如下代码: C++dll代码: 复制代码 代码如下: extern"C"__declspec(dllexport) char* ShowImages(BYTE img[],int w,int h){;} C#调用dll基本也是固定格式,如下样式,

  • 解决java调用dll报Unable to load library错误的问题

    如下: 1.确保路径下有该dll文件 2.dll和jdk必须确保同样是64位或者32位. 3.地址url中不能出现"/",必须是"\". 4.路径一定要对. 5.如果有同样的文件名出现,要在路径后面加上 ".dll",比如:System.getProperty("user.dir")+"\library"+"\PlayCtrl.dll" 补充知识:Java语言调用第三方dll文件的使用方

  • Python和java 如何相互调用

    目录 1.Java调用Python的函数 2.在java中调用本机python脚本中的函数 3.使用java直接执行python脚本 1.Java调用Python的函数 在java类中直接执行python语句 class="highlight"> import org.python.util.PythonInterpreter; /** * Created by wjf on 2018/3/16. */ public class java2python { public stat

  • Java调用dll文件的实现解析

    目录 Java调用dll文件 环境 接下来进入正文 Java调用dll文件几种常见方式 Java调用动态库需要关注的问题 一.数据类型对应关系 二.Jnative调用dll 三.JNA调用dll Java调用dll文件 近期根据C++做了一个图片质量检测的项目,目前需要在在java中进行调用,所以先在C++上生成dll文件,然后基于java调用dll文件实现功能. 环境 C++:VS2017(之前配置opencv真是要了老命) java:idea2020+jdk1.8. 注意:jdk安装的时候小

  • Python和java 如何相互调用

    目录 1.Java调用Python的函数 2.在java中调用本机python脚本中的函数 3.使用java直接执行python脚本 1.Java调用Python的函数 在java类中直接执行python语句 class="highlight"> import org.python.util.PythonInterpreter; /** * Created by wjf on 2018/3/16. */ public class java2python { public stat

  • Unity中C#和Java的相互调用实例代码

    1.通过C#调用Java的方法: 在C#中添加调用的一些代码,利用Unity提供的一些接口实现调用Java! private const string JAVA_CLASS_Name = "com.unity3d.player.UnityPlayer"; private void CallJavaFunc(string javaFuncName, params object[] args) { try { //获取到AndroidJavaClass,至于这里为什么调用这个类,我也不是很

随机推荐