JNA实战系列:第一个简单的JNA开发程序

文章目录

    • 第一个简单的JNA的开发程序
    • 一、引入依赖包
    • 二、创建一个接口,继承Libary类
    • 三、在Java中使用dll中封装的方法
    • 总结:
      • JNA中调用C、C++DLL或者.so库中的函数的步骤总结:
      • 思考

第一个简单的JNA的开发程序

假如有一个helloworld.h和一个helloworld.dll文件,需要使用JNA调用test.dll中封装的方法
test.h文件内容如下:

void HelloWorld()
{
	cout<<"Hello,World"<

使用Idea新建一个工程,创建一个Maven项目,将dll文件放到工程的resources目录下

一、引入依赖包

在pom.xml中加入JNA的依赖包,在dependencies加入如下内容:


<dependency>
    <groupId>net.java.dev.jnagroupId>
    <artifactId>jnaartifactId>
    <version>5.2.0version>
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);

答案其实很简单,接口中我们声明的那些方法其实在DLL/so的类库中已经被实现,Java只是对其进行了一个引入封装。代码中HelloJna Instance加载了类库中的“实现类”并将类库中的方法与我们的接口对象进行绑定。所以我们才能够调用HelloJna.Instance.helloWorld()方法。

后续我会继续更新SpringBoot系列、大数据系列、以及Python系列的相关学习笔记。期待和跟大家一起学习进步。感兴趣的同学可以关注我的公众号,期待你的光临。
JNA实战系列:第一个简单的JNA开发程序_第1张图片

你可能感兴趣的:(JNA实战系列,java,c++)