说明: 如果是windows平台 , 调用的是dll文件 , 如果是lunux平台 , 调用的是.so文件
1. so文件存放目录:
1.1 springboot项目中 , 在idea中存放目录为 resource/linux-x86-64 目录下.(如果是windows环境下 则存放目录为resource/win32-x86-64) . 将文件拷贝到指定目录下即可.
1.2 除了idea中 , 还需要将so文件存放到 linux服务器 , 存放路径为/lib 或者 /usr/lib 目录下.
1.2 操作后可到该目录下 使用 ldd 文件名.so 查看该文件做需要的动态链接库是否都存在 , 如果需要的其他链接库未正常显示 , 可以刷新链接库 或者 重新按顺序拷贝进来
(如上图如果有多个.so文件是需要互相调用的 , 入口在libFallObjectDetectSDK.so中 , 那么就应该在ldd libFallObjectDetectSDK.so 命令中查看到其他三个的动态链接库)
2. 编码
2.1 导入JNA 依赖
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.5.0</version>
</dependency>
2.2 编写代码读取调用DLL动态库文件中的方法
public class JNADllCall {
/**
* DLL动态库调用方法
* @Description: 读取调用CDecl方式导出的DLL动态库方法
*/
public interface CLibrary extends Library {
// DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径。(此处:(Platform.isWindows()?"libFallObjectDetectSDK":"FallObjectDetectSDK")指本地动态库windows环境下的libFallObjectDetectSDK.dll和lunux环境下的libFallObjectDetectSDK.so)
CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "libFallObjectDetectSDK" : "FallObjectDetectSDK"),CLibrary.class);
// 声明将要调用的DLL中的方法,可以是多个方法(此处示例调用本地动态库libFallObjectDetectSDK.dll中的FallobjectdetectStart()方法)
int FallobjectdetectStart(String url);
}
// 调用方式
public static void main(String[] args) {
int i = CLibrary.INSTANCE.FallobjectdetectStart("/home/test/a.txt");
System.out.println(i);
}
}
注意: CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "libFallObjectDetectSDK" : "FallObjectDetectSDK"),CLibrary.class); 在linux平台下加载文件名要比实际文件名前面少写一个lib
个人笔记