Spring Boot JNA 实现调用 DLL文件(清晰明了)

概述

项目需要用到 重采样算法,JAVA 没有现成的,只能通过 JNA 调用 C++ 的 DLL 实现,JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射。不再需要编写C动态链接库。

实现需求

根据 一个数组数据,算法根据数组生成多个相邻、相似的点。
案例:
原始数组:

[1,2,3,4,5,6,5,4,3,2,1]

生成10个:

[0.9975707933099867,2.0827107433705034,3.242373563930609,4.227786236390621,5.5680645300875815,5.6819573969217645,4.3206979326831965,3.3497212671714256,2.1727162369435766,1.115611206113079]

生成20个:

[1.0006736067597888,1.6136225699097613,2.0834240705596923,2.6000134251334908,3.2387063724897835,3.8026902204918467,4.232982835368568,4.801594298327119,5.562876758327512,6.0005892018875,5.686344251045411,4.934418414307205,4.317107510714494,3.885808545074988,3.3535095539415303,2.7104608356964937,2.167467521772395,1.7063151122165208,1.1234001156030098,0.45134020733353886]

实现效果

在这里插入图片描述

实践

gredle 或 maven

版本有很多,我用比较旧的,若有不适可以用新的

implementation 'net.java.dev.jna:jna:4.0.0'
<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>4.0.0</version>
</dependency>

NasalResamplingService

创建接口并声明方法,方法名与DLL中方法名对应

public interface NasalResamplingService extends Library {/*** @FileName NasalResamplingService.java* @description 重采样算法* @author lanys* @date 2024-4-15 17:14:04* @param srcArray 原始数组* @param desArray 生成后的数组(C++赋值)* @param desArraySize 生成后数组长度* @param srcArraySize 原始数据长度*/void myMatlabResample(double[] srcArray, double[] desArray, double desArraySize, double srcArraySize);}

DllUtils

@Slf4j
public class DllUtils {private NasalResamplingService instance;/** DLL 文件地址 */private final static String path = "文件地址";public DllUtils() {instance = (NasalResamplingService) Native.loadLibrary(path, NasalResamplingService.class);}public double[] resampling(double[] array, Integer extent) {TimeInterval timer = DateUtil.timer();if (array != null && array.length > 0) {double[] desArray = null;if (extent != null) {desArray = new double[extent];} else {desArray = new double[2000];}// 参数一:原始数据数组// 参数二:重采样数组// 参数三:重采样数据长度,固定2000// 参数四:原始数据个数(长度)instance.myMatlabResample(array, desArray, desArray.length, array.length);log.info("[DLL工具-重采样算法]DLL所需时间:{} 毫秒", timer.interval());return desArray;}return null;}/*** @FileName DllUtils.java* @description 关闭DLL释放内存* @author lanys* @date 2024-4-16 11:11:59*/public void dispose() {try {log.info("[DLL工具-释放DLL内存]");// 关闭DLL,防止内存泄漏NativeLibrary instance = NativeLibrary.getInstance(path);instance.dispose();}catch (Exception e){log.error("[DLL工具-释放内存]数据异常:",e);}}
}

Controller(自己写吧,很简单)

DllUtils dllUtils = new DllUtils();
double[] desArray = dllUtils.resampling(resamplingDTO.getSourceArray(), resamplingDTO.getGeneratingLength());
dllUtils.dispose();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/624881.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣152. 乘积最大子数组

Problem: 152. 乘积最大子数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化&#xff1a;首先&#xff0c;我们创建两个数组maxNum和minNum&#xff0c;并将它们初始化为输入数组nums。这两个数组用于存储到当前位置的最大和最小乘积。我们还需要一个变量maxProduc…

【Conda基础命令】使用conda创建、查看、删除虚拟环境及可能的报错处理

文章目录 前言&#xff08;1&#xff09; 在默认路径下创建一个新的虚拟环境&#xff08;2&#xff09; 查看已有的虚拟环境&#xff08;3&#xff09; 删除已有的虚拟环境&#xff08;谨慎操作&#xff09;&#xff08;4&#xff09;激活虚拟环境&#xff08;5&#xff09;退出…

2024 NTFS读写工具Tuxera NTFS for Mac 是如何进行下载、安装、激活的

本篇将为各位小伙伴们集中讲解一下NTFS读写工具Tuxera NTFS for Mac 是如何进行下载、安装、激活与换机的。 在数字化时代&#xff0c;数据交换和共享变得日益重要。然而&#xff0c;对于Mac用户来说&#xff0c;与Windows系统之间的文件交换可能会遇到一些挑战。这是因为Mac …

sqlilabs靶场1—20题学习笔记(思路+解析+方法)

前几个题目较为简单&#xff0c;均尝试使用各种方法进行SQL注入 第一题 联合查询 1&#xff09;思路&#xff1a; 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限&#xff0c;爆库&#xff0c;爆版本号 爆表&#xff0c;爆列&…

使用python采集VIP会电商平台商品数据②单页数据采集

获取标头&#xff1a; 响应&#xff1a;服务器返回的数据 预览&#xff1a;查看响应得数据 载荷&#xff1a;查询参数/请求参数 标头&#xff1a;查看请求的网址/请求的标头/请求方法 数据包地址&#xff1a;https://mapi.vip.com/vips-mobile/rest/shopping/pc/product/mo…

uniapp 组件传值

uniapp 组件传值 父传子子传父 uniapp 组件传值 父传子 在uniapp中&#xff0c;组件传值主要通过props进行。以下是一个简单的例子&#xff1a; 首先&#xff0c;创建一个组件MyComponent.vue&#xff1a; <template><view><text>{{ message }}</tex…

IBM SPSS Statistics for Mac中文激活版:强大的数据分析工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析工具&#xff0c;为Mac用户提供了高效、精准的数据分析体验。 IBM SPSS Statistics for Mac中文激活版下载 该软件拥有丰富的统计分析功能&#xff0c;无论是描述性统计、推论性统计&#xff0c;还是高级的多元统计分析&am…

Jenkins + Docker 一键自动化部署 SpringBoot 应用最精简流程

本文章实现最简单全面的 Jenkins Docker Spring Boot 一键自动部署项目。步骤齐全&#xff0c;少走坑路。 环境&#xff1a;CentOS7 Git (Gitee) 实现步骤&#xff1a;在 Docker 安装 Jenkins&#xff0c;配置 Jenkins 基本信息&#xff0c;利用 Dockerfile 和 Shell 脚本…

Python LEGB规则

Python在查找“名称”时&#xff0c;是按照LEGB规则查找的&#xff1a; Local&#xff1a; 指的就是函数或者类的方法内部 Enclosed&#xff1a; 指的是嵌套函数&#xff08;一个函数包裹另一个函数&#xff0c;闭包&#xff09; Global&#xff1a; 指的是模块中的全局变量 Bu…

数学建模完整版

模型与适用题型 微分方程传染病预测模型 神经网络 层次分析法 粒子群算法 matlab 优劣解距离法

k-means聚类算法的MATLAB实现及可视化

K-means算法是一种无监督学习算法&#xff0c;主要用于数据聚类。其工作原理基于迭代优化&#xff0c;将数据点划分为K个集群&#xff0c;使得每个数据点都属于最近的集群&#xff0c;并且每个集群的中心&#xff08;质心&#xff09;是所有属于该集群的数据点的平均值。以下是…

AppleScript初体验,让你的mac实现自动化UI操作

AppleScript 简介 AppleScript是苹果公司开发的一种脚本语言&#xff0c;用于操作MacOS及其应用程序&#xff0c;在实现MacOS自动化工作方面非常给力。 我们可以使用AppleScript用来完成一些重复琐碎的工作&#xff0c;AppleScript具有简单自然的语法&#xff0c;另外系统也提…