Java使用JNA调用C/C++

预计阅读时长:1min

必备工具(JNA)

github地址:https://github.com/java-native-access/jna

下载以下两个文件:

  1. JNA的jar包(开发必备)
  2. JNA的项目源码(方便查看源码注释)

开发流程

C++部分

  1. 使用 Visual Studio 创建 具有导出项的动态链接(DLL)项目
    在这里插入图片描述
  2. 我的项目名是 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;
}

  1. 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);
  1. 将编译环境改为 JDK 对应的环境(我的jdk是64位的),否则Java执行会报错,点击 生成→生成解决方案
    在这里插入图片描述
    在这里插入图片描述
  2. 根据4中输出的 Dll2.dll 文件路径,找到 Dll2.dll 文件,粘贴到Java项目的 src 目录下
    在这里插入图片描述

Java部分

  1. 定义一个接口
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);
}

  1. 测试调用
package indi.jna;

public class Test {
	public static void main(String[] args) {

		int s = MyDll.myDll.add(4, 5);
		System.out.println(s);
	}
}

  1. 运行结果
    在这里插入图片描述

版权声明:本文为weixin_44155115原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。