使用的工具为vs2017,IDEA
1. 使用vs2017生成dll文件
出现新建项目弹框
可以修改名称和位置;
等待项目生成;
鼠标右键头文件,添加,新建项
本项目该文件命名为TESTDll.h
编辑该文件
以C编译
#pragma once
extern "C" __declspec(dllexport) double Add(double a, double b);
extern "C" __declspec(dllexport) double Divide(double a, double b);
项目 源文件 文件夹中有一个和项目同名的.cpp文件,本项目重命名了TESTDll.cpp
在该文件中编写函数;
// TEST.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h" //预编译头
#include "TESTDll.h"
#include <stdexcept> //标准的异常类
//_declspec(dllexport)
double Add(double a, double b)
{
return a + b;
}
//_declspec(dllexport)
double Divide(double a, double b)
{
if (b == 0)
{
throw std::invalid_argument("b 不能是 0!");
}
return a / b;
}
注意需要引用刚才新建的头文件 #include "TESTDll.h"
右击项目名,选择属性
点击配置管理器
根据项目要求,选择x86还是x64,必须和java项目相同
生成 》》解决方案
得到dll文件
2. 回到java项目中
在resources文件中新建dlls文件夹,将生成的dll文件拷贝到该文件夹中
在pom文件中引入依赖
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.4.0</version>
</dependency>
有些jna的版本,虽然maven官方仓库中有依赖,但是加载不下来,可以换一个版本试试
新建test类测试一下
package zbinfo.util;
import com.sun.jna.Library;
import com.sun.jna.Native;
/**
* @program: ZBSERVICE
* @description: 测试调用dll
* @author: Mr.Li
* @create: 2019-09-03
**/
public class test {
public interface TestDll1 extends Library{
TestDll1 instance = (TestDll1) Native.load("H:/project/svn/监测预警评估/trunk/ZBSERVICE/src/main/resources/dlls/TEST",TestDll1.class);
public double Add(double a, double b);
public double Divide(double a, double b);
}
public static void main(String[] args){
double sum = TestDll1.instance.Add(10, 5);
double divide = TestDll1.instance.Divide(10, 5);
System.out.println("Add(10, 5) = " + sum);
System.out.println("Divide(10, 5) = " + divide);
}
}
本文使用Native.load()函数,第一个参数引入的时dll文件的绝对路径,
还可以使用Native.loadLibrary()函数
运行主函数;
运行结果为: