趣文网 > 作文大全

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

2020-12-02 04:00:01
相关推荐

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分析,发现没有缺少任何依赖项,为此问题折腾了半天,好在终于把问题解决。

阅读剩余内容
网友评论
相关内容
延伸阅读
小编推荐

大家都在看

作文题目亲情 暗恋的作文 这一天作文 作文 我的名字 小学的老师作文 秋天的作文怎么写 小松鼠作文 我和爸爸作文 春天300字作文 家乡作文800字 母亲600字作文 感动600字作文 生日快乐作文 写感动的作文 感动中国作文 见闻的作文 与众不同作文 三年级上作文 变化作文素材 善意作文 春天里的作文 关于爱国作文 作文学习 泰山的作文 青春期作文 家乡的特产作文 小狗作文300字 重拾 作文 梦想作文500 写端午作文