前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java 调用 dll动态库

java 调用 dll动态库

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

检查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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java调用Golang生成的动态库(dll,so)
如果提示命令未找到,那么说明你的计算机中还没有gcc,去安装一个吧,gcc官方网站:https://gcc.gnu.org/ 如果从来没有安装过gcc的朋友可以直接安装win-build,可以帮你快速的安装 官方网站:http://mingw-w64.org/doku.php/download/win-builds
李海彬
2019/05/08
5.3K0
使用jna调用c语言动态库对接华视电子身份证阅读机
一些C语言的接口见上一篇文章 同样把用到的动态库放到jdk的bin目录文件夹下 Termb.java
周杰伦本人
2022/10/25
6370
使用jna调用c语言动态库对接华视电子身份证阅读机
Java跨语言调用,使用JNA访问Java外部接口
先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C++的过程,注意写程序时自下而上,调用时自上而下。
朝雨忆轻尘
2019/06/18
4.6K0
c#封装动态库_nginx调用so动态库
一直对动态库的封装理解不是很透彻,虽然之前写过一个Demo,不过并没有真正的理解。所以写下来,帮助自己理解下。
全栈程序员站长
2022/11/14
2.9K0
c#封装动态库_nginx调用so动态库
【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )
Android Studio 中使用 Android.mk 配置第三方 动态库 :
韩曙亮
2023/03/27
3.7K0
【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )
java高级用法之:调用本地方法的利器JNA
JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做java native interface。要想使用JNI,我们需要在JAVA代码中定义native方法,然后通过javah命令创建C语言的头文件,接着使用C或者C++语言来实现这个头文件中的方法,编译源代码,最后将编译后的文件引入到JAVA的classpath中,运行即可。
程序那些事
2022/03/28
1.9K0
Java调用so文件[通俗易懂]
公司的硬件让我帮忙调用一个so文件,想着一直都没机会自己写一个jni,于是就答应了,在调用的过程中还踩了不少坑,特地写一篇博客记录一下。
全栈程序员站长
2022/11/04
9.8K0
Java调用so文件[通俗易懂]
【错误记录】Android Studio 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | 指定 APK 打包动态库的 CPU 架构 )
外部引用 so 动态库 , 如果只有一个 armeabi-v7a 的动态库 , 那么如果在 arm64 的手机上执行 , 就会报如下出错误 ;
韩曙亮
2023/03/29
7340
【错误记录】Android Studio 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | 指定 APK 打包动态库的 CPU 架构 )
Linux下跨语言调用C++实践
总第504篇 2022年 第021篇 不同的开发语言适合不同的领域,例如Python适合做数据分析,C++适合做系统的底层开发,假如它们需要用到相同功能的基础组件,组件使用多种语言分别开发的话,不仅增加了开发和维护成本,而且不能确保多种语言间在处理效果上是一致的。本文以美团搜索实际场景下的案例,讲述在Linux系统下跨语言调用的实践,即开发一次C++语言的组件,其他语言通过跨语言调用技术调用C++组件。 1 背景介绍 2 方案概述 3 实现详情 3.1 功能代码 3.2 打包发布 3.3 业务使用 3.4
美团技术团队
2022/04/24
6.2K0
Linux下跨语言调用C++实践
LoadLibrary加载动态库失败
1.1 文件路径的确错误。比如:本来欲加载的是A文件夹下的动态库a.dll,但是经过仔细排查原因,发现a.dll动态库竟然被拷贝到B文件夹下去了。
全栈程序员站长
2022/07/18
2.9K0
jnaerator:java调用动态库的神器,JNA代码自动生成工具
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/79252303
10km
2019/05/25
4.5K0
Java调用C/C++ 动态库dll操作串口实例
大家好,今天分享的是使用C/C++编写一个读取串口数据的代码,然后将其编译成Windows下的动态链接库(.dll文件),然后写一个简单的java demo来调用C/C++接口。
飞哥
2021/08/06
1.5K0
【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )
Android Studio 中使用 Android.mk 配置第三方 静态库 :
韩曙亮
2023/03/27
4.5K0
【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )
python调用dll动态库
python调用动态库有两种类型,主要看dll的导出函数的调用约定:__stdll和__cdecl
py3study
2020/01/08
2.5K0
【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )
参考博客 : 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )
韩曙亮
2023/03/27
9.7K0
【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )
Android so 加载原理分析
http://gityuan.com/2017/03/26/load_library/
望天
2020/01/02
8.2K0
Android So动态加载 优雅实现与原理分析
开源地址: https://github.com/AnyMarvel/ManPinAPP
Anymarvel
2020/06/12
6.2K0
Android So动态加载 优雅实现与原理分析
java调用c++的几种方式
jna是jni的封装,可以直接写c++代码(导入java的c头文件),再通过java调用,jna没有jni效率高。
sofu456
2022/09/27
6290
Windows平台LoadLibrary加载动态库搜索路径的问题
在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方。这样一方面可以与其他程序共享这些动态库,还能保证插件安装时非常的清爽。就Adobe Premiere Pro/After Effects来说,插件文件是放到C:\Program Files\Adobe\Common\Plug-ins\7.0\MediaCore(Windows平台)的。这个是PremierePro和AfterEffects的公共插件目录,二者在启动的时候都会尝试去这个位置加载插件。与此同时,我们希望自己开发的插件所依赖的动态库放到另外的位置,另外也希望插件显示链接的动态库能够尽量少。因为如果是显式链接的话,这些插件依赖的动态库必须和插件保存在同一个位置。不然插件找不到这些依赖文件就会加载失败的。当然,我们也可以在环境变量里面增加一条路径,但是这容易污染环境变量,或者与其他的程序库产生冲突。LoadLibrary在这个时候就产生作用了。LoadLibrary通过将指定路径的动态库加载到当前的调用进程,然后获取其导出的函数就可以正常使用了。对于像第三方插件这样的应用场景,LoadLibrary可以说是个不错的实现方式。但是正因此也有个弊端,我们无法使用工具得知其的依赖库。
24K纯开源
2019/11/23
4.9K1
【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
外部引用 so 动态库 , 拷贝到 jniLibs , 尽量 4 架构都设置完全 ;
韩曙亮
2023/03/29
1.1K1
【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
推荐阅读
Java调用Golang生成的动态库(dll,so)
5.3K0
使用jna调用c语言动态库对接华视电子身份证阅读机
6370
Java跨语言调用,使用JNA访问Java外部接口
4.6K0
c#封装动态库_nginx调用so动态库
2.9K0
【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )
3.7K0
java高级用法之:调用本地方法的利器JNA
1.9K0
Java调用so文件[通俗易懂]
9.8K0
【错误记录】Android Studio 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | 指定 APK 打包动态库的 CPU 架构 )
7340
Linux下跨语言调用C++实践
6.2K0
LoadLibrary加载动态库失败
2.9K0
jnaerator:java调用动态库的神器,JNA代码自动生成工具
4.5K0
Java调用C/C++ 动态库dll操作串口实例
1.5K0
【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )
4.5K0
python调用dll动态库
2.5K0
【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )
9.7K0
Android so 加载原理分析
8.2K0
Android So动态加载 优雅实现与原理分析
6.2K0
java调用c++的几种方式
6290
Windows平台LoadLibrary加载动态库搜索路径的问题
4.9K1
【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
1.1K1
相关推荐
Java调用Golang生成的动态库(dll,so)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验