- 1. JNA(Java Native access)
- github的项目地址:https://github.com/java-native-access/jna
- B站学习地址:Java使用JNA调用C/C++动态链接库dll_哔哩哔哩_bilibili
- 2. JNA的基础介绍
- JAVA语言可以通过JNA机制,去访问C++定义的函数,进而实现了JAVA和C++的交互
- JNA机制:也可以称作动态链接库机制
- DLL:Dynamic Link Library:动态链接库
- JNA是基于JNI发展出来的一个技术,实际上是一个类库。
- 3. 使用步骤
- 1、下载Jar包,导入Java项目
- 下载地址:https://github.com/java-native-access/jna#jna
- 2、创建一个C++项目:具有导出项的DLL动态链接库项目
- (1) 按照示例,定义导入导出函数
- 示例:
-
TESTDLL_API add(int a, int b) { int value = a + b; return value; }
-
- 示例:
- (2) 编译运行C++项目。生成TESTDLL.dll 文件
- (1) 按照示例,定义导入导出函数
- 3、将上一步生成的TESTDLL.dll 粘贴到 JAVA项目中,同时在JAVA项目中定义此dll文件对应的interface: MyDll,这个接口需要继承JNA中的Library
- (1) interface 的 code
-
public interface MyDll extends Library { MyDll myDll = (MyDll) Native.load("TESTDLL", MyDll.class); // myDll 是 MyDll 的一个实例 // TESTDLL 是 TESTDLL.dll动态链接库文件的名字 // MyDll.class:字节码文件,反射机制 // 上面这行 code 就是将 TESTDLL.dll 实例化成一个对象 int add(int a, int b); }
-
- (2) mian()函数的code
-
public class Main { public static void main(String[] args) { int value = MyDll.myDll.add(1, 1); // 通过MyDll中实现的myDll对象,此对象是由 TESTDLL.dll 实例化而成,因此可以调用 TESTDLL.dll库文件显示的add(int, int)方法 System.out.println(value); // 2 } }
-
- (1) interface 的 code
- 1、下载Jar包,导入Java项目
- 4、总结:
- Java通过JNA(Java Native access)调用C++语言的函数实现
- 4、DLL优点:
- (1)DLL可以节省内存,并且减少页面的交换
(2)DLL文件与调用者是独立的,只要DLL输出的接口不变(包括:名称,参数、返回值类型、或者是调用的约定等不变),更换DLL文件或者是更新DLL文件中的实现方法,而不去改变方法的(包括:名称,参数、返回值类型、或者是调用的约定等),就不会对调用者有影响。
(3)不同编程语言编写的程序,只要按照函数约定就可以去调用DLL中的函数。
(4)适用于大规模的软件开发,使得开发相对独立、低耦合,便于不同开发组织之间进行开发和测试
(5)节约磁盘空间
- (1)DLL可以节省内存,并且减少页面的交换
- 4、调用DLL文件的步骤:
- 1. 写一个测试类
2. 生成class文件
3. 根据class文件生成class头文件,C/C++头文件
- 1. 写一个测试类



