解决JAVA调用C++ DLL文件Unable to load library的问题

JAVA项目开发中,有时候会遇到调用C++编写的动态链接库的场景(比如调用第三方的动态链接库、软件中关键部分用C++编码提供给外部调用)。我们知道JAVA调用动态链接库(C/C++),可以通过以下二种方式:JNI、JNA。

JNI:Java Native Interface是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互,不过JNI调用过程相当的麻烦。

JNI调用原理

JNA:Java Native Access是SUN公司主导开发的,建立在经典JNI的基础之上的一个开源框架,简化调用过程不需要编写任何Native/JNI代码。JNI调用示例代码:

JNI调用示例

执行调用,看到红色的字眼”Exception in thread “main” java.lang.UnsatisfiedLinkError: Unable to load library”,我们从以下几个方面排除和解决该错误:

一. 确认调用文件的运行环境,确认DLL文件运行的c++ runtime library版本,确认电脑是否已经安装。

二. 确认Native.loadLibrary调用的DLL文件路径是否正确,尽量写完整路径,有时候写相对路径会有问题。另外注意系统环境,Windows下的动态链接库是dll,Linux中的是.so文件,路径的分隔符也不同,windows是\反斜杠,Linux是/斜杆。

三. 确认当前系统的位数X86/X64,然后调用对应版本的动态链接库。

四. 如果1,2,3步骤排除了还是解决不了,考虑是动态链接库版本的问题,尝试使用其他语言调用一下比如C#,以下是C#的示例代码:

[DllImport(“xxxxxx.dll”)]

public static extern int test(String Input, String Output);

如果C#调用一样提示:无法加载动态链接库,则可能是执行调用的电脑本机缺少动态链接库需要的其它依赖。

我们下载depends工具,分析动态库依赖哪些其他的库文件,我们打开depends.exe程序后,在主界面将我们要分析的DLL文件拖到窗体中,稍微等待几秒depends工具分析完毕后,在窗体左上角区域如果出现黄色的问号,便是本地执行该动态链接库缺少的依赖了。

depends分析DLL文件依赖项

如果缺少依赖项我们可以联系DLL文件的提供者,是否需要安装其他的组件库。

另外我们有时候编写的动态链接库,如果是Debug生成的DLL文件会附带其他很多不需要的依赖,如果调用的机器上不存在这些依赖,也会提示Unable to load library。如果选择Realse生成DLL文件体积减少了很多,而且有可能依赖项也会减少。有次我们在项目中就是遇到这个问题,一开始DLL在本机可以调用,但是到了服务器环境一直提示不能加载动态链接库,服务器c++ runtime library已经安装,并且调用代码跟本机完全一致,通过depends在服务器上分析,发现缺少依赖项。后来由C++ DLL的提供方重新生成了Realse的版本,问题得到解决。再次用depends分析,发现没有缺少任何依赖项,为此问题折腾了半天,好在终于把问题解决。

原文链接:
https://baijiahao.baidu.com/s?id=1631687758034136984&wfr=spider&for=pc

龙腾一族至尊龙骑

Original: https://www.cnblogs.com/1175429393wljblog/p/16129580.html
Author: 龙骑科技
Title: 解决JAVA调用C++ DLL文件Unable to load library的问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/536365/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球