文章目录
- 前言
- 1.c开发动态库dll
- 1.1 新建项目dllDemo
- 1.2 选择C library 在选择shared
- 1.3 项目的目录结构
- 1.4 定义动态库函数
- 1.5 导出动态库
- 2.java中使用jna调用dll
- 2.1 需要引入jna的依赖
- 2.2 加载动态库dll
- 2.3 测试程序
- 2.3.1 测试代码:
- 2.3.2 测试结果输出
前言
在日常的开发中,对接外部接口常常有很多的对接方式,wsdl,rest,以及第三方提供的动态库等,本次将讲解在java中如何调用c开发的动态库。
1.c开发动态库dll
开发工具Clion,创建动态链接库。
1.1 新建项目dllDemo
1.2 选择C library 在选择shared
要选择shared,static是静态的
1.3 项目的目录结构
包含头文件.h,和主要的代码.c文件,cmakelist.txt构建的脚本
1.4 定义动态库函数
头文件定义两个动态库方法,hello以及add方法。
#ifndef DLLDEMO_LIBRARY_H
#define DLLDEMO_LIBRARY_H
void hello(void);
int add(int a,int b);
#endif //DLLDEMO_LIBRARY_H
在.c中写方法的具体实现。
#include "library.h"
#include <stdio.h>
void hello(void) {
printf("调用动态库hello方法成功!\n");
}
//定义一个加法的方法
int add(int a,int b){
int result = a+b;
printf("调用动态库add方法:%d + %d=%d",a,b,result);
return result;
}
1.5 导出动态库
简单动态库不需要在构建脚本中加入过多的代码,直接build project即可生成dll。
到此为止动态库开发已经完毕,接下来就是开发java来调用dll。
2.java中使用jna调用dll
2.1 需要引入jna的依赖
<dependency>
<groupId>com.sun</groupId>
<artifactId>jna</artifactId>
<version>5.10.0</version>
</dependency>
2.2 加载动态库dll
jna提供了方法与c方法一一映射的方法,提供一个接口继承library即可。
代码如下:
public interface DllDemo extends Library {
DllDemo instance = Native.load("libdlldemo.dll", DllDemo.class);
void hello();
int add(int a,int b);
}
这是jna 提供c与java数据类型的对应关系。
2.3 测试程序
2.3.1 测试代码:
public class TestDllDemo {
public static void main(String[] args) {
DllDemo.instance.hello();
int result = DllDemo.instance.add(2,4);
System.out.println(result);
}
}
调用可以看到错误,Exception in thread "main" java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。
此错误是因为jdk的版本位数和动态 库的不一致导致的,两种解决方法:
- 修改生成的dll的版本位数
- 使用和dll版本匹配的jdk即可。
此处我直接修改jdk版本的位数。
2.3.2 测试结果输出
到此为止 ,动态库的调用就结束啦。喜欢或者对你有帮助点个关注不迷路!