预计阅读时长:1min
必备工具(JNA)
github地址:https://github.com/java-native-access/jna
下载以下两个文件:
开发流程
C++部分
- 使用 Visual Studio 创建
具有导出项的动态链接(DLL)项目
- 我的项目名是
Dll2
,所以编辑Dll2.cpp
文件添加函数
#include "pch.h"
#include "framework.h"
#include "Dll2.h"
#include <iostream>
using namespace std;
// 这是导出变量的一个示例
DLL2_API int nDll2 = 0;
// 这是导出函数的一个示例。
DLL2_API int fnDll2(void)
{
return 0;
}
// 这是自己添加的函数
DLL2_API int add(int a, int b) {
cout << "执行dll add函数" << endl;
return a + b;
}
// 这是已导出类的构造函数。
CDll2::CDll2()
{
return;
}
- 在
Dll2.h
中声明函数
#ifdef DLL2_EXPORTS
#define DLL2_API __declspec(dllexport)
#else
#define DLL2_API __declspec(dllimport)
#endif
// 此类是从 dll 导出的
class DLL2_API CDll2 {
public:
CDll2(void);
// TODO: 在此处添加方法。
};
extern DLL2_API int nDll2;
DLL2_API int fnDll2(void);
// 在这里声明刚刚定义的函数
//extern "C"的作用见 https://www.cnblogs.com/xiangtingshen/p/10980055.html
extern "C" DLL2_API int add(int a, int b);
- 将编译环境改为 JDK 对应的环境(我的jdk是64位的),否则Java执行会报错,点击 生成→生成解决方案
- 根据4中输出的
Dll2.dll
文件路径,找到Dll2.dll
文件,粘贴到Java项目的src
目录下
Java部分
- 定义一个接口
package indi.jna;
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface MyDll extends Library{
// 实例化一个MyDll对象
MyDll myDll=(MyDll)Native.load("Dll2",MyDll.class);
// 方法定义,与dll中定义要一样,数据类型映射参考 https://github.com/java-native-access/jna/blob/master/www/Mappings.md
int add(int a,int b);
}
- 测试调用
package indi.jna;
public class Test {
public static void main(String[] args) {
int s = MyDll.myDll.add(4, 5);
System.out.println(s);
}
}
- 运行结果
版权声明:本文为weixin_44155115原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。