问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SpringBoot集成JNA调用动态库

创作时间:
作者:
@小白创作中心

SpringBoot集成JNA调用动态库

引用
CSDN
1.
https://blog.csdn.net/mickey2007/article/details/136812362

本文将介绍如何在SpringBoot项目中集成JNA(Java Native Access)来调用动态库。通过本文,你将学习到JNA的基本概念、SpringBoot工程的创建步骤、JNA依赖的引入方法以及具体的代码实现。

1. JNA概述

JNA(Java Native Access)是一个开源的Java框架,是Sun公司推出的一种调用本地方法的技术,是建立在经典的JNI基础之上的一个框架。之所以说它是JNI的替代者,是因为JNA大大简化了调用本地方法的过程,使用很方便,基本上不需要脱离Java环境就可以完成。

JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数。

原来使用JNI,你必须手工用C写一个动态链接库,在C语言中映射Java的数据类型。

JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射,你不再需要编写C动态链接库。

也许这也意味着,使用JNA技术比使用JNI技术调用动态链接库会有些微的性能损失。但总体影响不大,因为JNA也避免了JNI的一些平台配置的开销。

2. 创建SpringBoot基础工程

2.1 创建Maven工程

2.2 配置Maven地址

2.3 设置自动导入包

2.4 设置启动注解

2.5 引入依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.4.RELEASE</version>
</parent>
<dependencies>
    <!--引入spring-boot启动器依赖, 添加启动器后web工程常用的依赖会自动帮你引入-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

2.6 编写启动类

package com.miaxis;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3. 引入JNA依赖

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.8.0</version>
</dependency>

4. 动态库存放路径

  • 项目中放在resource目录下
  • 或者放在resources\win32-x86-64目录下

5. JNA接口代码

package com.miaxis.jna;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public interface MXFingerAlgAPI extends Library {
    MXFingerAlgAPI myinstance = (MXFingerAlgAPI) Native.loadLibrary(
            Platform.isWindows() ? "MXFingerAlg" : "MXFingerAlg_linux64.so", MXFingerAlgAPI.class);

    /**
     * @function Get the version of the algorithm
     * @param    strVersion - [out], version(100bytes)
     * @return   0-success, other-failed (see ErrorCode.h)
     */
    public int zzGetVersion(byte[] szVersion);
}

6. 测试控制类

package com.miaxis.controller;

import com.miaxis.jna.MXFingerAlgAPI;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Api(tags = "测试组")
public class HelloController {
    @GetMapping("algversion")
    public String algversion() {
        byte[] bAlgVersion = new byte[100];
        MXFingerAlgAPI.myinstance.zzGetVersion(bAlgVersion);
        System.out.println("finger_alg_version: " + new String(bAlgVersion));
        return new String(bAlgVersion);
    }
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号