当前位置: 首页 > news >正文

Java DLL依赖缺失解决思路和修复过程(Windows版本)

1、简单了解下opus

在工业语音采集和识别的领域,通常使用opus压缩原始音频,转成opus文件在进行传输。
opus文件是使用opus音频编码格式进行编码的音频文件,是一种开源、免专利费用的音频压缩格式。经过opus压缩后,可以将原始音频(pcm文件)内存大小压缩到原来的十分之一左右,压缩效率非常高,这样传输的流量得到了极大减轻,程序处理能力都得到了极大增强。

2、Windows下Java调用C++,实现opus能力

opus在java中并没有可用开源的三方包,但在C++中经常使用。
在开发阶段,通常通过JNI方式生成一个OpusJNI.dll的windows库文件。内部是通过C++实现了opus格式转码的相关的操功能。如:pcm格式文件转opus格式文件,opus格式转回pcm格式等。
当然,在C++的实现逻辑中,一般也需要引用一些的额外库文件。就像java程序通过import导如额外的包一样,C++也会引入额外头文件来简化业务逻辑处理。这就要求我们的电脑上需要有这些库文件,当然C++的集成开发工具Microsoft visual studio可以轻松的帮我们完成这项工作。
在安装Microsoft visual studio时,添加“使用C++的桌面开发”的工作负载,这样Microsoft visual studio会自动帮我们在电脑上安装并配置好C++桌面开发相关的库文件,也包含了opus相关的依赖库文件。

Microsoft visual studio添加工作负载,如下图所示:
在这里插入图片描述
如果之前已经安装配置过Microsoft visual studio,也可以直接编辑修改工作负载。

3、政策限制,问题产生

但有时候,你的公司可能会因为相关政策的原因,不在允许员工继续使用Microsoft visual studio这款软件。(⊙︿⊙)
没办法,作为一名打工仔,只能响应公司政策,够把软件给卸载了。
在这里插入图片描述
卸载后,问题就来了。之前可以本地调试的opus接口,就都不能运行了。
在这里插入图片描述
如上的错误,大概意思就是:程序在加载OpusJNI.dll(windows是找.dll文件,linux上通常是.so文件)库文件时,JVM找到了这个文件,但在加载该DLL时发现它所依赖的某些其他DLL(依赖库)缺失或无法找到。
很显然,这是因为卸载Microsoft visual studio导致相关的库文件也被删除了。

4、解决DLL依赖缺失步骤

1、分析目标OpusJNI.dll文件

首先我们找到加载的OpusJNI.dll,分析一下该文件依赖哪些DLL文件。

(1)、下载DLL依赖分析工具

地址:https://github.com/lucasg/Dependencies?tab=readme-ov-file
打开后,点击如下的位置下载工具。
在这里插入图片描述

(2)、打开DLL分析工具

解压后,点击如下的文件打开分析工具。
在这里插入图片描述
打开后如下:
在这里插入图片描述

(3)、选择DLL文件,拖入分析

将本地OpusJNI.dll文件拖进去,如下图所示,可以看到OpusJNI.dll文件依赖了3个文件。
缺少:VCRUNTIME140D.dll和ucrtbased.dll文件2个文件。
已存在:kernel32.dll文件。
在这里插入图片描述
根据上面的依赖情况,我们在C:\Windows\System32目录下查找,也的确如上一样,前两个找不到,第3个可以找到。

2、找到依赖DLL文件

重新安装:
这里我是通过再次安装Microsoft visual studio找回来的,如果公司的电脑已经不能安装,那就找一台其他的电脑再次安装。
重新安装Microsoft visual studio后,并添加了“C++桌面开发”的工作负载后,就可以在C:\Windows\System32目录下找到这3个dll文件了。
这里我是通过再次安装软件找到的依赖库,因为这样找比较全,可以防止依赖库中进一步缺少依赖。其他途径找也都可以。

备份依赖dll文件:
此时,把C:\Windows\System32下的dll文件都备份一份,再次卸载Microsoft visual studio。重启电脑后,会发现和之前一样还是会丢失前两个库文件。

缺失文件添加到环境变量中:
将备份中的VCRUNTIME140D.dll和ucrtbased.dll文件放到C:\Windows\System32下,通过分析工具,再次分析OpusJNI.dll文件,可以看到已经不在缺少依赖了。
在这里插入图片描述

再次运行我们的java程序,就运行成功了。
在这里插入图片描述
正常生成了1.opus文件。
在这里插入图片描述

向阳而生,Dare To Be!!!

http://www.xdnf.cn/news/874261.html

相关文章:

  • JVM 内存结构 详解
  • 【Java】CopyOnWriteArrayList
  • 使用 SseEmitter 实现 Spring Boot 后端的流式传输和前端的数据接收
  • 陈伟霆电视剧《九门》开机 续写传奇热血新篇
  • 【博客X】缤果串口蓝牙网络USB调试助手(总汇)
  • python打卡day44
  • 如何通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式(并进行了训练、推理)
  • SQL 中 IN 和 EXISTS 的区别
  • 局部变量-线程安全
  • 池化层-机器学习
  • 5.Promise,async,await概念(1)
  • 【SpringCloud】Nacos配置中心
  • 【HarmonyOS 5】游戏开发教程
  • 面向文档编程:MoonBit 的创新开发体验
  • 照片按时间自动重命名工具
  • Java异常信息
  • PaddleOCR(1):PaddleOCR介绍
  • 雷达流速仪相关介绍
  • 微信小程序开发一个自定义组件的详细教程
  • Haystack:AI与IoT领域的全能开源框架
  • 996引擎-前端组件:富文本(RichText)
  • 研究探析 | 高速摄像机在一种新型冲击压痕技术及其动态标定方法中的应用
  • unix/linux,sudo,其发展历程详细时间线、由来、历史背景
  • Origin如何仅删除奇数行或偶数行的数据
  • shell脚本总结14:awk命令的使用方法
  • 【力扣链表篇】203.移除链表元素
  • DIC技术助力金属管材全场应变测量:高效解决方案
  • 线程的生命周期与数量设置
  • 鸿蒙Navigation路由导航-基本使用介绍
  • SwiftUI 数据绑定与视图更新(@State、@ObservedObject、@EnvironmentObject)