文章目录
- 第一个简单的JNA的开发程序
- 一、引入依赖包
- 二、创建一个接口,继承Libary类
- 三、在Java中使用dll中封装的方法
- 总结:
- JNA中调用C、C++DLL或者.so库中的函数的步骤总结:
- 思考
第一个简单的JNA的开发程序
假如有一个helloworld.h和一个helloworld.dll文件,需要使用JNA调用test.dll中封装的方法
test.h文件内容如下:
void HelloWorld()
{cout<<"Hello,World"<<std::endl;
}
使用Idea新建一个工程,创建一个Maven项目,将dll文件放到工程的resources目录下
一、引入依赖包
在pom.xml中加入JNA的依赖包,在dependencies加入如下内容:
<!-- jna -->
<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.2.0</version>
</dependency>
二、创建一个接口,继承Libary类
package com.zealink.hqchart.hqdata;import com.sun.jna.*;
import com.sun.jna.win32.StdCallLibrary;public interface HelloJna extends Library {HelloJna Instance = (HelloJna) Native.load("D:\\java\\test\\src\\main\\java\\dll\\helloworld", HelloJna.class);void HelloWorld();
}
Tips:因为只是一个简单的测试,所以代码中我使用了绝对路径来引入dll,在实际使用过程中使用相对路径即可,如果在springboot中使用,则可以将dll放入到resources目录中
三、在Java中使用dll中封装的方法
创建测试类HelloJnaTests,代码如下:
package com.zealink.hqchart;import org.junit.jupiter.api.Test;
import org.junit.platform.commons.annotation.Testable;@Testable
public class HelloJnaTests {@Testvoid run() {try {HQChart.Instance.HelloWorld();} catch (Exception e) {System.out.println(e.getMessage());}}
}
执行测试类,在控制台输出Hello,World,说明调用成功
总结:
JNA中调用C、C++DLL或者.so库中的函数的步骤总结:
- 引入JNA的相关jar包
- 创建一个接口,继承自Library类。
- 在接口中创建一个对象,加载DLL/so的类库
- 在接口中声明DLL/so类库的头文件.h中暴露的方法,以上步骤完成后便可以使用接口中创建的对象来调用DLL/so类库中的方法。
思考
我们只是在Java中创建了一个接口Interface,并没有在Java中实现这个接口,为什么我们能够调用接口中的方法呢?接口是在哪里实现的呢?
HelloJna Instance = (HelloJna)Native.load("helloworld", HelloJna.class);
答案其实很简单,接口中我们声明的那些方法其实在DLL/so的类库中已经被实现,Java只是对其进行了一个引入封装。代码中HelloJna Instance加载了类库中的“实现类”并将类库中的方法与我们的接口对象进行绑定。所以我们才能够调用HelloJna.Instance.helloWorld()方法。
后续我会继续更新SpringBoot系列、大数据系列、以及Python系列的相关学习笔记。期待和跟大家一起学习进步。感兴趣的同学可以关注我的公众号,期待你的光临。