解决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)

大家都在看

  • C++ 内联函数解析(inline)

    inline是C++语言中的一个关键字,可以用于程序中定义内联函数,inline的引进使内联函数的定义更加简单。说到内联函数,这里给出比较常见的定义,内联函数是C++中的一种特殊函…

    C++ 2023年5月29日
    046
  • 解决c++中delete后内存系统不回收

    一般new出来的内存,delete掉后。 此时如果看top内存没有减少,则可以使用下面函数让系统强制回收。 #include malloc_trim(0); Original: h…

    C++ 2023年5月29日
    081
  • 收藏的博客 — Qt/C++学习

    Qt Creator环境: 使用Qt Creator作为Linux IDE,代替Vim:实现两台Linux电脑远程部署和调试(一台电脑有桌面系统,一台电脑无桌面系统) 使用Qt C…

    C++ 2023年5月29日
    047
  • Embarcadero 发布开源Bloodshed Dev C++ 分支

    Bloodshed Dev C++ 是一个老牌、小巧、快速的开源C++ IDE,它是用delphi 6开发的,从2000年开始 已经被下载过了67,796,885次。是学校、单位学…

    C++ 2023年5月29日
    060
  • TechEmpower 21轮Web框架 性能评测 — C# 的性能 和 Rust、C++并驾齐驱

    自从2021年2月第20轮公布的测试以后,一年半后 的2022年7月19日 发布了 TechEmpower 21轮测试报告:Round 21 results – Tec…

    C++ 2023年5月29日
    062
  • c++的对象初始化

    忍不住了,不得不吐槽一下,妈的,太复杂了,真难,搞得太复杂了,看不懂,看不懂,真的越来越复杂了,没有必要啊! 看得了头皮发麻,搞不明白,咱又不是干编译器的,投降了。 工程代码中,代…

    C++ 2023年5月29日
    053
  • 使用Visual Leak Detector for Visual C++ 捕捉内存泄露

    1、下载vlc 2、创建应用并配置 c/c++ -> General -> Additional Include Directories = C:\Program Fi…

    C++ 2023年5月29日
    049
  • 自己总结 C++ 代码规范

    1.编写原则,代码尽量简单,简洁,高效,自己写的代码让自己和别人容易看懂 2.命名: a. 类的成员变量加前缀 m_(表示 member)。 常量全用大写的字母,用下划线分割单词(…

    C++ 2023年5月29日
    056
  • C++解决share_ptr造成的循环引用

    参考链接:https://blog.csdn.net/yc2zgh1314/article/details/51264963 https://www.cnblogs.com/dua…

    C++ 2023年5月29日
    048
  • C++中的friend函数详细解析(二)

    一.设计模式 单例模式(类只能生成一个对象) 屏蔽构造函数,拷贝构造函数(放在private中 类外无法访问),此时类外就无法看到这两个函数了 也就无法生成对象了 类就没有意义了 …

    C++ 2023年5月29日
    058
  • JNI支持C++与C的区别

    C++的代码后缀是”.cpp” 在JNI.h 文件中有两套代码。一套是支持c的, 一套是支持JNI的。 JNI中针对C的代码是: C中调用方式: JNI中针…

    C++ 2023年5月29日
    063
  • C#与c++对应的类型

    C#与c++对应的类型 csharp;gutter:true; C#调用C++的DLL搜集整理的所有数据类型转换方式-转载</p> <pre><cod…

    C++ 2023年5月29日
    041
  • Emacs 设置C++代码风格

    EMACS中的C++ 代码风格设置 1 ;; C++代码风格设置 2 (defconst cobbcpp 3 ‘("linux" ; this is inher…

    C++ 2023年5月29日
    054
  • C++ 引用计数

    原址: https://blog.csdn.net/u012501459/article/details/48229399 C++没有像java那样的垃圾回收机制,但是我们可以实现…

    C++ 2023年5月29日
    073
  • 代朋友发招聘信息,C++程序员

    急招:高级C/C++程序员工作职能:1、开发工具(地图编辑,动作编辑器等)的维护及新版本的开发。2、Symbian、WM新游戏开发要求:1、精通C/C++语言;2、强烈的责任心和认…

    C++ 2023年5月29日
    052
  • c++ 异常 discards qualifiers 丢弃

    src/feedbackservice.cpp:76: error: passing const ps::spider::urlreceiver::entry::ConfigMan…

    C++ 2023年5月29日
    038
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球