1.JNA框架
a.定义:JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架
b.作用:JNA提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
c.导入maven依赖
<dependencies> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.3.1</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.3.1</version> </dependency> ...... </dependencies>
2.调用系统自带动态链接库
public class TestPrintf { public interface CLibrary extends Library { // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径 CLibrary INSTANCE = (CLibrary) Native.load((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class); // 声明将要调用的DLL中的方法(可以是多个方法) void printf(String format, Object... args); } public static void main(String[] args) { CLibrary.INSTANCE.printf("Hello, World\n"); for (int i=0;i < args.length;i++) { CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]); } } }
3.调用自定义dll
a.在VC2019中创建新项目,命名为TestDll1
b.创建头文件 test.h
#pragma once #define MYLIBAPI extern "C" _declspec(dllexport) MYLIBAPI int sum(int a, int b);
c.创建源文件 test.cpp
#include "pch.h" #include "test.h" #include <stdio.h> int sum(int a, int b) { return a + b; }
d.在工具栏选择x64(32位则选择x86)
e.点击项目TestDll1,右键选择“生成”,生成dll
f.将生成的dll放入resource中
g.创建测试类
public class TestDll { public interface TestDllLib extends Library { // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径 TestDllLib INSTANCE = (TestDllLib) Native.load("TestDll1", TestDllLib.class); // 声明将要调用的DLL中的方法(可以是多个方法) int sum(int a, int b); } public static void main(String[] args) { int result = TestDll.TestDllLib.INSTANCE.sum(2, 3); System.out.println("result: " + result); } }
h.注意:运行前需要用maven执行 clean package,保证 dll 打包进 target 中,不然可能报无法找到dll的错误
i.JNA数据类型对应关系
i.参考文档:https://blog.csdn.net/shendl/article/details/3589676