天天看点

jna调用dll

看下dll文件格式

jna调用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);
           

继续阅读