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!!!