解决调用文件的问题英语

核心提示JAVA项目开发中,有时候会遇到调用C++编写的动态链接库的场景。我们知道JAVA调用动态链接库,可以通过以下二种方式:JNI、JNA。JNI:Java Native Interface是Java平台的一部分,可用于让Java和其他语言编写

在JAVA项目开发中,有时候会遇到调用C++编写的动态链接库的场景。我们知道JAVA可以通过以下两种方式调用dll:JNI和JNA。

JNI:Java原生接口是Java平台的一部分,可以用来让Java与其他语言编写的代码进行交互,但是JNI调用过程相当麻烦。

JNI调用原理

JNA:Java Native Access是SUN公司开发的基于经典JNI的开源框架。没有必要编写任何本机/JNI代码来简化调用过程。JNI呼叫样本代码:

JNI调用示例

执行,看到红色字“线程异常”main“Java . lang . UNSATISFIEDlinkERROR:无法加载库”。我们从以下几个方面来消除和解决这个错误:

1.确认调用文件的运行环境,DLL文件的c++运行时库版本,以及计算机是否已经安装。

2.确认Native.loadLibrary调用的DLL文件路径是否正确,并尝试写入完整路径。有时候写相对路径会有问题。另外,要注意制度环境。windows中的dll是DLL,而。所以Linux中的文件是。所以文件和路径分隔符也不同。Windows是反斜杠,Linux是/对角线。

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

四。如果步骤1、2、3被排除或者无法解决,就考虑DLL版本的问题,尝试用其他语言调用,比如C#。以下是C#的示例代码:

[Dllimport]

公共静态外部内部测试;

如果C#调用提示无法加载动态链接库,可能是调用计算机缺少动态链接库所需的其他依赖项。

我们下载了depends工具来分析动态库依赖于其他哪些库文件。在我们打开depends.exe程序后,我们将需要分析的DLL文件拖到主界面的表单中。等待几秒钟后,如果表单左上角出现一个黄色的问号,那就是动态链接库的本地执行缺乏依赖性。

depends分析DLL文件依赖项

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

另外,有时候我们会写动态链接库。如果是Debug生成的DLL文件,会伴随很多其他不必要的依赖。如果这些依赖项在调用机器上不存在,它也会提示无法加载库。如果选择Realse生成DLL文件,体积会大大减少,有可能依赖项也会减少。有一次我们在项目中遇到了这个问题。一开始本地可以调用DLL,但是到了服务器环境,总是表示不能加载动态链接库。已经安装了server c++运行时库,调用代码与本机完全一致。通过对服务器依赖关系的分析,我们发现了依赖关系的缺失。后来Realse的版本被C++ DLL的提供者重新生成,问题就解决了。再一次,通过对依赖关系的分析,发现不缺任何依赖关系,问题折腾了很久,最后还是解决了问题。

 
友情链接
鄂ICP备19019357号-22