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);
}
}
热门推荐
探秘传统糖画的艺术魅力
Excel表格列自动排序的多种实现方法
全网最敢说的美食博主,我看不够
行为树模式(BT)和有限状态机模式(FSM)
吃斋念佛的20个冷知识
三款家常卤肉的做法及配料
健康科普 | 擦伤、摔伤后这样消毒才正确!
如何选择合适的钻头
美国问责署报告中的巡洋舰升级奇闻:钱没少花但发生了什么?
读懂数字经济澎湃之势背后的应然之理
美国人咋样?深入了解他们的生活方式与文化特点
留学生在美国能否合法购买枪支
为何35岁会成为职场的年龄分界线?这道就业门槛如何破解?
掌握这些数字与时间的表达方式,提升你的英语实用能力!
三种人不能吃三九胃泰,是真的吗
日本乡村振兴策略的深度解析与启示
新生婴儿吐奶怎么办?五种实用解决方案
脂质组与蛋白质组分析揭示深渊狮子鱼对极端深海环境的适应机制
大青叶蝉:分布、危害、形态特征、发生规律及防治措施
瘦小腿肌肉最快的方法
WCBA常规赛新赛制探讨:A、B组分离,季后赛争夺更加激烈
宋徽宗赵佶:被称为“三流皇帝,一流艺术家”的他,决心改过自新
西甲第8轮前瞻:马竞皇马德比战,毕巴主场称雄,贝蒂斯欲止颓?
缓解颈椎疼痛的有效方法与生活习惯调整指南
心智成长有七个递进的阶段,最后可以变成一个真正自在的人
脑供血不足挂啥科室
AI作曲该何去何从?“数字缪斯——2024音乐科技融创节”正式启动
交通信号灯的历史和演变
日本秋季赏花指南:2025赏花日历及15处人气赏花景点大盘点
当韩国总统:最危险的职业