jna调用dll

本文介绍如何使用Java的JNA技术调用C语言生成的DLL动态库,包括定义POJO类映射C结构体,创建接口与DLL方法映射,及调用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一下使用java的jna技术调用c生成的dll动态库。

看下dll文件格式

1. 定义pojo和c的结构体对应的属性

 需要定义(int d, double len)

 注: 一定要继承Structure

/**
 * 封装c结构体
 * 
 * @author cq
 */
public class Data extends Structure {
	
	public int d;

	public double len;

	// 结构体传指针
	public static class ByReference extends Data implements Structure.ByReference {
	}

	// 结构体传值
	public static class ByValue extends Data implements Structure.ByValue {
	}

	@Override
	protected List getFieldOrder() {
		return Arrays.asList(new String[] { "d", "len" });
	}

}

2. 定义接口 - 和dll文件映射

 注: int SleepStr(Data d1);  方法名, 参数, 返回值一定要和dll中的对应一致

/**
 * dll接口,方法参数映射
 * 
 * @author qizhentao
 */
public interface SleepDllService extends Library {
	
	// 指定Sleep.dll文件 / 或者dll文件放项目根目录下直接Sleep文件名即可
		//jna linux相对路径调用c/c++接口时候,名称必须是lib开头,且第一个参数是lib后面的名称,如libtest.so,加载时候应该使用test来加载
		//jna win相对路径调用c/c++接口时候,直接名称不加后缀调用,如test.dll,加载时候应该使用test来加载
		//jna linux绝对路径调用c/c++接口时候,完整路径加上后缀,如test.so,加载时候应该使用/opt/test.so来加载
		//jna win相对路径调用c/c++接口时候,完整路径可以不接后缀,如test.dll,加载时候应该使用D:\\test来加载
	SleepDllService INSTANCE = (SleepDllService) Native.loadLibrary("C:\\Users\\cq\\Desktop\\b\\Sleep.dll", SleepDllService.class);
	

	// 调用: int resultDll = SleepDllService.INSTANCE.SleepStr(new Data(11, 12));
	int SleepStr(Data d1);
}

 3. 调用接口

Data d1 = new Data();
d1.d = numberA.getA();
d1.len = 10.1;
// 调用dll
int resultDll = SleepDllService.INSTANCE.SleepStr(d1);
System.out.println("c++返回: " + resultDll);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

祁_z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值