最近由于公司业务需要,要调用dll文件
本文采用JNA调用。
注意!!!FBI警告!!如果你的dll文件是64位的话,就要用64位的jdk!如果你的dll文件是32位的话,就要用32位的jdk!
注意!!!FBI警告!!如果你的dll文件是64位的话,就要用64位的jdk!如果你的dll文件是32位的话,就要用32位的jdk!
注意!!!FBI警告!!如果你的dll文件是64位的话,就要用64位的jdk!如果你的dll文件是32位的话,就要用32位的jdk!
本文提供的dll测试文件是32位的,所以对应的jdk版本是32位的!
环境:win10 ,32位jdk1.8 ,java8版本
dll文件对应函数
int add(int a,int b);
int dec(int a,int b);
int Handle(int (*Callback)()); //里面参数,需要我们传回调函数
java调用步骤
1.pom.xml文件增加jna依赖
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
</dependency>
2.编写调用接口
package com.dll.demo.demo.dllService;
import com.sun.jna.Library;
import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
public class DllService {
public interface JNATestDll extends Library {
//对应dll的函数名,名字要一样
public int add(int a,int b);
public int dec(int a,int b);
//对应的回调函数
public void Handle(Cback c);
//dll的回调函数java只能用回调接口
public interface Cback extends StdCallCallback {
public void hello();
}
//下面实现接口
public class CbackIpm implements Cback{
//这个是我们要传入的函数
@Override
public void hello() {
System.out.println("我是回调函数,执行成功");
}
}
}
}
3.测试调用
@Test
void testDll() {
DllService.JNATestDll instanceDll = (DllService.JNATestDll) Native.loadLibrary("D:\\TestDll.dll", DllService.JNATestDll.class);
//调用dll普通函数
int sum =instanceDll.add(10,60);
int sum2 =instanceDll.dec(10,20);
//调用dll回调函数
DllService.JNATestDll.Cback cc =new DllService.JNATestDll.CbackIpm();
instanceDll.Handle(cc);
System.out.println("add调用结果:"+sum);
System.out.println("dec调用结果:"+sum2);
}
4.附上调用结果
注意!!!
dll文件的路径一定要写对!!你放哪里就写哪里!!!