java调用dll 释放dll 随调随关 之 JNA 操作

本文采用JNA调用DLL

note:个人尝试过JNI,Jnative,等其他调用方式.总而言之 繁琐,不适合Java吧.或者不适合小编,这里只推荐JNA,核心代码三行搞定调用DLL.

jnative好用,但是文件路径等等还是有问题,不能像java一样去使用。也不推荐

jna调用,意外之喜很好用的。貌似是对Jnative进行了封装.可以自行研究一下,之前研究的 忘了…

.

step1 JNA Maven 仓库引入

注意事项:java调用dll 需要jdk32位版本

		// 版本自己去Maven仓库搜 一般用最新版本的上1-2个版本
		<dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>4.1.0</version>
        </dependency>

.

step2 将DLL构造成interface

@Component
public class sendEdiByJnaforJobId {
	
	// 接口名字 我直接写的 DLL文件名
	public interface EDI_Middleware extends Library {
	
		// 加载DLL  StaticConstant.EDI_MIDDLEWARE_DLL 这是DLL路径,你可以直接放在 项目Resource下,直接写DLL名字即可调用,也可指定路径C:\\ddd\\xxx.....
		EDI_Middleware INSTANCE = (EDI_Middleware)Native.loadLibrary(StaticConstant.EDI_MIDDLEWARE_DLL, EDI_Middleware.class);
		
		// DLL文件对应的方法名 这些函数名字,返回值 必须跟你的DLL是一致的,不能随意写.不然JNA反射是找不到你的方法的. 你可以直接把DLL中的函数名字粘贴 过来.
		void initial_DM();
		
		// DLL文件对应的方法名
		int gen_edi2carrier(Integer java,Double a);
		
	}
	
	// 自己封装了一个work方法调用DLL
	public void work(Long jobId) {
		
		Double jobD=jobId.doubleValue();
		int java=0;
		// DLL调用 方式一  调用完 不关闭DLL
//		EDI_Middleware.INSTANCE.initial_DM();
//		int a=EDI_Middleware.INSTANCE.gen_edi2carrier(java,jobD);
//		System.out.println(a);
		try {
		//  DLL调用 方式二 调用完 关闭DLL
			NativeLibrary instance = NativeLibrary.getInstance(StaticConstant.EDI_MIDDLEWARE_DLL);
			instance.getFunction("initial_DM").invoke(new Object[]{});
			instance.getFunction("gen_edi2carrier").invokeDouble(new Object[]{java,jobD});
			instance.dispose();
		}catch (Exception e){
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("static-access")
	public static void main(String[] args) {
		// 我用 组件扫描到容器了 我可以@autowired 调用
		sendEdiByJnaforJobId aaaa=new sendEdiByJnaforJobId();
		long aaa1=4106465; // 4099988
		aaaa.work(aaa1);
	}
}

是不是很简单,最重要的就是构造 与DLL与之对应的接口类.

简而言之,jna需要自己定义java接口,这个类的方法和dll文件一样,你必须十分清楚dll文件的结构和里面的方法以及返回值,参数。
将DLL映射成Java 接口.这样JNA在调用时反射生成实现类,这样就可以随心随意用我们的java进行调用了.

step3 小结一下

释放DLL也是自己反射生成的,JNA没有提供显示调用close DLL.本人参照了的显示调用DLL,进了源码看见作者是用NativeLibrary进行Close的,所以我就反射 自己生成 自己关闭DLL.

Java调用DLL不难 大家不会灰心.

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值