文章目录

  • 第一个简单的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);