文章目录
- 第一个简单的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 {
@Test
void 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);