SpringBoot中Java调用dll

2023-05-16

1、背景

最近接手的项目,底层算法是C++写的,并且封装成了dll。而目前的需求,需要把这些算法移到服务端执行。不可能把C++写的算法库改用Java重写一遍,而且也基于执行效率的考虑,采用Java调用dll的方案

2、依赖包

添加依赖如下:

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

3、常见的写法

查资料,经常见到如下的实现

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

public class XXXX {
    ...
    public interface JnaDll extends Library {
        int funname(String content);
        JnaDll jnaDll = (JnaDll)Native.load("D:\\xx\\...\\xx", JnaDll.class);
    }
    ...
    public void xxxx() {
        int result = JnaDll.jnaDll.funname("xxx");
        ...
    }
}

4、局限性

可以看到,dll路径是写死在代码里的。

如果需要将dll路径放到配置文件中怎么办?即需要放到application-xxx.yml中。

5、解决方案

我们可以把dll的方法封装成Java服务,如下:

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

@Service
public class XXXX {
    @Value("${xx.xx}")
    private String dllPath;
    ...
    private interface JnaDll extends Library {
        int funname(String content);
        int funname2(Pointer pointer);
    }
    JnaDll jnaDll;
    private JnaDll getJnaDll() {
        if (jnaDll == null) {
            jnaDll = (JnaDll)Native.load(this.dllPath, JnaDll.class);
        }
        return jnaDll;
    }
    ...
    public void xxxx() {
        int result = getJnaDll().funname("xxx");
        ...
    }
}

6、分析

(1)代码中的接口JnaDll其实只是个申明,是dll中C方法的封装,这个接口只在当前类中有效即可,所以可以申明为私有接口

(2)相应的变量在哪里都可以申明和实例化,不一定只能属于该接口,也不一定只能申明时实例化

7、参数说明

(1)从dll中返回字符串,接口定义返回类型为const char*,没成功,只好将传入参数类型改为char*,而Java中对接的参数为Pointer。

调用方法传参前,要保存空间足够,写法如下:

Pointer pointer = new Memory(xxxx);
getJnaDll().funname2(pointer);

(2)只是给dll传入const char*,不需要dll返回字符串,则传入String即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot中Java调用dll 的相关文章

  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • 在文本文件中搜索单词并返回其频率

    如何在包含单词文本的文本文件中搜索特定单词并返回其频率或出现次数 使用扫描仪 String text Question how to search for a particular word in a text file containin
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情

随机推荐

  • macbook文件误删怎么恢复

    因为外形美观 xff0c 质地轻薄 xff0c 性能优越等原因 xff0c MacBook被很多用户用作工作笔记本 xff0c 方便随身携带办公 用户的MacBook一般都存储了大量的重要数据 xff0c 如果数据丢失肯定会给用户带来很大的
  • IOS开发基础篇--CAShapeLayer的strokeStart和strokeEnd属性

    一 案例演示 最近有一个小需求 xff0c 就是要做一个圆形进度条 xff0c 大概样子如下 xff1a 在不知道有CAShapeLayer的strokeStart和strokeEnd属性的时候 xff0c 我采取的方法就是实时的 移除旧的
  • 求n个数的最大值、最小值、平均值 (15 分)

    从键盘输入n xff08 3 lt 61 n lt 61 20 xff09 个整数 xff0c 求出这n个数的最大值 最小值 平均值 xff08 平均值保留2位小数 xff09 输入格式 在第一行输入一个介于3至20之间的整数n xff0c
  • Pandas数据处理/drop_duplicates()/映射map()/replace()/rename()/分箱/过滤异常值/随机抽样take()/random.permutation()

    1 删除重复元素 使用duplicated 函数检测重复的行 xff0c 返回元素为布尔类型的Series对象 xff0c 每个元素对应一行 xff0c 如果该行不是第一次出现 xff0c 则元素为True import numpy as
  • libjpeg的移植

    libjpeg是什么东西 xff1f libjpeg是一个开源源码包 xff0c 功能是图片格式之间的相互转换 compress decompress 移植步骤 xff1a xff11 解压源码 不要解压到共享目录中去 xff0c 共享文件
  • TCP实现服务器与单客户端连接(多线程)

    局域网内实现单客户端与服务器通信 客户端通过配置ip和端口号来连接服务器 客户端和服务器端各自具有发送和接收线程 可以实现一方持续发送 服务器端 package Net import java io IOException import j
  • python练习题(四十二):809*??=800*??+9*?? 其中??代表两位数, 809*??为四位数,8*??为两位数,9*??为3位数。求??代表的两位数,及809*??后的结果?

    span class token comment 题目 xff1a span span class token comment 809 61 800 43 9 其中 代表一个两位数 span span class token comment
  • Android 利用V4L2 调用camera

    为何要使用V4L2进行开发 出于安全原因 xff0c 使用Android 原生的Camera接口 xff0c 必须要使用可见的surface显示摄像头的preview图像 xff0c 即必须要让用户看到你的应用正在使用摄像头 另外Andro
  • MySql 8.0 设置允许远程登录授权

    MySQL 连接出现 is not allowed to connect to this MySQL Server错误提示 打开 MySQL8 0 Command Line Client 1 打开远程连接 mysql span class
  • 基于Jeecg的权限获取

    Jeecg的权限 xff0c 是通过菜单管理中的 按钮 权限 实现的 xff0c 前端和后端怎么获取这个权限呢 xff0c 本文简单做个记录 1 前端 import USER AUTH from 34 64 store mutation t
  • 基于Jeecg使用vue-konva

    konva是一个基于canvas的可视化框架 xff08 https konvajs org xff09 xff0c vue konva则是基于vue的 当前的一个小项目是基于Jeecg开发的 xff0c 想做可视化的功能 xff0c 于是
  • 基于JeecgBoot的v-has权限控制

    v has是一个很方便的前端权限控制标签 xff0c 但是只支持一个授权标识 xff0c 如果需要两个或以上的权限与或运算就不支持了 解决方案 xff1a 修改文件 64 utils hasPermission js 中的方法filterG
  • 前后端离线开发相关软件下载地址大全

    一 后端开发 xff1a 1 IDEA Windows xff1a https www jetbrains com zh cn idea download section 61 windows 2 JDK Windows xff1a htt
  • 离线部署GitLab

    一 背景 公司是局域网开发环境 xff0c 资源文件用svn管理 xff0c 代码用git管理 GitLab有点大 xff0c 而且只能在Linux下使用 xff0c 所以选择了轻巧的GitBlit 后来GitBlit被暴漏洞 xff0c
  • C# WPF实战项目升级了

    概述 之前用Caliburn Micro搭建的WPF实战项目 xff0c CM框架选用了 3 0 3 xff0c 实际上CM框架目前最新版已经到4 0 173了 xff0c 所有很有必须升级一下项目了 本来打算把平台框架也直接升级到 NET
  • 接入Swagger2(1) —— SwaggerUI

    关于Swagger不再多述 xff0c 这里只分享接入方式 1 接入 SpringBoot中引入Swagger相当简单 xff0c 只需要添加一个依赖就行 xff0c 如下 xff1a lt dependency gt lt groupId
  • 接入Swagger2(2) —— knife4j

    上一篇文章介绍了Swagger2默认UI的接入方式 xff0c 但是UI实在太丑 xff0c 而且布局也很难用 xff0c 这里介绍一个相对漂亮点的UI knife4j knife4j是基于swagger2开发的 xff0c 是swagge
  • SpringSecurity的使用(1)—— 起步

    年初就关注到SpringSecurity了 xff0c 看官网 xff0c 看不懂 xff1b 查资料 xff0c 跟我预想的不一样 xff0c 所以一直入不了门 有博文说添加依赖 xff0c 再次启动项目就会跳转到登录页面 我是前后端分离
  • 离线模式:Unresolved dependency: ‘com.xx.xx:xx-xx:jar:x.x.x‘

    SpringBoot最常用的编译器就是IDEA xff0c 如果不能联网 xff0c 则需要将工程设置为离线模式 1 遇到的问题 这两天遇到了这样的问题 xff1a JeecgBoot的工程中有添加依赖包 knifej spring boo
  • SpringBoot中Java调用dll

    1 背景 最近接手的项目 xff0c 底层算法是C 43 43 写的 xff0c 并且封装成了dll 而目前的需求 xff0c 需要把这些算法移到服务端执行 不可能把C 43 43 写的算法库改用Java重写一遍 xff0c 而且也基于执行