Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java 调用 dll动态库

java 调用 dll动态库

作者头像
用户10125653
发布于 2022-11-10 13:52:37
发布于 2022-11-10 13:52:37
4.8K03
代码可运行
举报
文章被收录于专栏:changechange
运行总次数:3
代码可运行

检查dll动态库

通过软件 DependenciesGui.exe 检查CloseLoopCalDll.dll动态库

  • 动态库缺少依赖

注意点:缺陷dll核心依赖,加载的时候会报错缺少依赖,如果是Windows系统依赖缺失并且dll算法并没有调用此依赖时,是可以加载成功的

  • 动态库打包错误

注意点:dll虽然可以成功加载,但是由于动态库的打包错误,相应的方法是找不到。

  • 正确的动态库

java程序加载dll动态库

  • 导入依赖
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//jna
implementation group: 'net.java.dev.jna', name: 'jna'
  • 按路径加载
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  private static void loadFile(String ext,File file){
        if (ext.equals(".so") || ext.equals(".dll")) {
            try {
                System.load(file.getPath());
                log.info("加载native文件[{}]成功!!", file);
            } catch (UnsatisfiedLinkError e) {
                log.error("加载native文件[{}]失败!!请确认操作系统是否能解析文件", file);
            }
        }
    }
  • 按文件名加载
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private static void loadFile(String ext,File file){
        if (ext.equals(".so") || ext.equals(".dll")) {
            try {
                System.loadLibrary(file.getName());
                log.info("加载native文件[{}]成功!!", file);
            } catch (UnsatisfiedLinkError e) {
                log.error("加载native文件[{}]失败!!请确认操作系统是否能解析文件", file);
            }
        }
    }

注意点:加载dll动态库可以自己创建类和方法去实现

调用dll动态库

  • 创建接口类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface CloseLoopCal extends Library {}

注意点:接口类需要继承 Library 类

  • 编写java 抽象方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
boolean SafeAnalysis(double[] result,byte[] data,int count,double[] parameter,  String filePath);
  • 与其对应的c++方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool SafeAnalysis(double *result, char *data, int count, double *parameter, char *fname);
  • 基本数据类型映射关系
  • 调用dll动态库
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//很关键 设置字符集,字符集不匹配无法调用dll
System.setProperty("jna.encoding", "GB2312");
Native.setProtected(true);
CloseLoopCal closeLoopCal = Native.loadLibrary("CloseLoopCalDll", CloseLoopCal.class);
closeLoopCal.SafeAnalysis(new double[10],new byte[10],5,new double[10],"");

注意点:字符集的类型和调用dll字符集类型必须保持一致

生产环境运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
生产环境下和测试环境下略有不同,测试环境下我们只需要把dll放到项目根目录即可加载dll,生产环境运行的是jar包,dll可能没有一起打包,会导致找不到dll的问题,网上解决办法比较多,自行解决。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
不是你记忆中的单例模式,但适用的程度,更胜一筹
我有一个好朋友广军,为了体验生活,在学校旁边盘了个店面,开了家奶茶汉堡店。 店面新开张,首先要做的事儿就是去工商局登记一下,然后做个章。
看、未来
2020/09/16
3350
用C++跟你聊聊“单例模式”,类的“计划生育”
在学习设计模式之前,我唯一接触的设计模式就是“单例模式”。因为数据库的对象必须保证它的唯一性,一个数据库只能对应一个对象,不然有多个对象可以对数据进行访问那岂不是乱套?我还没写完你就读?
看、未来
2020/08/26
5930
设计模式之单例模式(Singleton)
单例模式(Singleton Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
海盗船长
2021/12/07
3340
设计模式之单例模式(Singleton)
聊一聊最难的设计模式 - 单例模式
很多人上来肯定一脸懵逼,因为在你的印象中,单例模式实现起来还是很简单的。不要着急,慢慢往下看,你就知道为什么我说它最难了。 1. 基本概念 单例模式是一种常用的创建型设计模式。单例模式保证类仅有一个实例,并提供一个全局访问点。 2. 适用场景 想确保任何情况下都绝对只有一个实例。 典型的场景有:windows 的任务管理器、windows 的回收站、线程池的设计等。 3. 单例模式的优缺点 优点 内存中只有一个实例,减少了内存开销。 可以避免对资源的多重占用。 设置全局访问点,严格控制访问
山海散人
2021/03/03
3170
聊一聊最难的设计模式 - 单例模式
设计模式-单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。
Anymarvel
2018/10/22
4300
设计模式之单例模式
  Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。   单例模式能够保证一个类仅有唯一的实例,并提供一个全局访问点。单例模式主要有3个特点:
雨落凋殇
2019/12/25
4350
23设计模式之 --------- 单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
默 语
2024/11/20
1060
23设计模式之 --------- 单例模式
设计模式(五):单例模式
设计模式(五):单例模式
Java架构师必看
2021/05/14
2140
JAVA设计模式之单例模式
作者:炸斯特 出处:https://blog.csdn.net/jason0539 概念:   java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。 单例模式有以下特点:   1、单例类只能有一个实例。   2、单例类必须自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例。   单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对
Tanyboye
2018/07/02
4020
一起学习设计模式--01.单例模式
单例模式是创建型模式的一种,是创建型模式中最简单的设计模式 用于创建那些在软件系统中独一无二的对象。虽然单例模式很简单,但是它的使用频率还是很高的。
独立观察员
2022/12/06
6000
一起学习设计模式--01.单例模式
设计模式-单例模式
单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
六月的雨在Tencent
2024/03/28
1360
设计模式-单例模式
JAVA设计模式之单例模式
public static Singleton getInstance() {
一觉睡到小时候
2019/07/04
4210
JAVA设计模式之单例模式
精讲设计模式【单例模式】
单例模式确保一个类只有一个实例,并提供一个全局访问点,实现单例模式的方法是私有化构造函数,通过getInstance()方法实例化对象,并返回这个实例
高大北
2022/06/14
1880
设计模式(一)之单例模式
关键代码:构造函数是私有的。 应用场景: 1.一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 2.创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。 3.Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。 UML图:
周杰伦本人
2023/10/12
2540
设计模式(一)之单例模式
设计模式之单例模式
在学习设计模式时 , 我们尽量掌握每种模式的场景 , 意义 ,以及思维模式的转化 ,而不是死记硬背代码
时间静止不是简史
2021/03/04
3970
设计模式之单例模式
【C++】设计模式详解:单例模式
​ 拷贝只会发生在两个场景中:拷贝构造函数、赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。
利刃大大
2025/02/02
2360
设计模式—— 七 :单例模式
Sngleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实 例,并且是自行实例化的(在Singleton中自己使用new Singleton())。
三分恶
2020/07/16
3130
【设计模式】之单例模式
单例模式是23种设计模式中最简单、最常见的一种,也是各个公司面试题中必考的设计模式之一,是程序猿必备掌握的。
xcbeyond
2020/04/02
3880
3分钟学设计模式(创建型):1、单例模式
经过汇总的23种设计模式它是总结了面向对象设计当中最有价值的经验。对之前来讲可能是对其中部分设计模式还是相对来说熟悉的但仔细琢磨还是会有些疑问,正好在目前相对来说有更多的业余时间,可以来一次重新学习设计模式!
木瓜煲鸡脚
2021/10/08
3260
【C++】设计模式 — 从零开始认识单例模式
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。设计模式也是类似,是代代相传的智慧!
叫我龙翔
2024/08/15
1530
相关推荐
不是你记忆中的单例模式,但适用的程度,更胜一筹
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档