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

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

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

后续我会继续更新SpringBoot系列、大数据系列、以及Python系列的相关学习笔记。期待和跟大家一起学习进步。感兴趣的同学可以关注我的公众号,期待你的光临。
微信公众号图片

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:下文中的 *** 代表文件名中的版本号。 # 【jna-***.jar中文文档.zip】 中包含: 中文文档:【jna-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【jna-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【jna-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【jna-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【jna-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: jna-***.jar中文文档.zip,java,jna-***.jar,net.java.dev.jna,jna,***,com.sun.jna,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'net.java.dev.jna', name: 'jna', version: '***' Gradle (Short): implementation 'net.java.dev.jna:jna:***' Gradle (Kotlin): implementation("net.java.dev.jna:jna:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` com.sun.jna com.sun.jna.internal com.sun.jna.platform ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.sun.jna.AltCallingConvention com.sun.jna.Callback com.sun.jna.Callback.UncaughtExceptionHandler ...... ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值