准备工作
直接在mvn仓库搜索jna下载对应jar包和依赖包
依赖包
jna-5.5.0.jar
jna-platform-5.5.0.jar
一、编写C代码
mylib.h文件
#ifndef _MYLIB_H_
#define _MYLIB_H_
// 加法运算
int add(int a, int b);
#endif
mylib.c文件
#include <stdio.h>
#include "mylib.h"
// 实现
int add(int a, int b) {
printf("dll function add() called\n");
return (a + b);
}
二、编译dll
执行以下命令得到dll后,得到dll动态链接库
> gcc -shared -o mylib.dll mylib.c
三、使用jna调用dll
创建Main.java
import com.sun.jna.Library;
import com.sun.jna.Native;
public class Main {
public interface CLibrary extends Library{
// DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径
CLibrary INSTANCE = (CLibrary) Native.load("mylib.dll", CLibrary.class);
// 声明将要调用的DLL中的方法
int add(int a, int b);
}
public static void main(String[] args) {
System.out.println("1 + 2 = " + CLibrary.INSTANCE.add(1, 2));
}
}
为上述文件都在同一目录中
四、运行结果
> javac -Djava.ext.dirs=<jar路径> Main.java
> java -Djava.ext.dirs=<jar路径> Main
或者
> javac -cp jna-5.5.0.jar;jna-platform-5.5.0.jar Main.java
> java -cp jna-5.5.0.jar;jna-platform-5.5.0.jar; Main
结果为
dll function add() called
1 + 2 = 3
注意事项
出现java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。
是因为jdk位数和dll位数不一致,换成一致的即可。
参考: