看下dll文件格式
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLzcGRPh3ZE9kMNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0cTM5ITM1kDM4EjMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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);