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

大家都在看

  • CLion之C++框架篇-优化框架,单元测试(二)

    背景 结合上一篇CLion之C++框架篇-安装工具,基础框架的搭建(一) ,继续进行框架优化! googletest(GTest)是Google开源的C++测试框架,与CLion组…

    C++ 2023年5月29日
    086
  • 采用C++17新标准 “共享锁”和“独占锁”更低消耗更好性能地保护不常更新的共享数据

    用到的标准库: std::shared_lock<>、 std::shared_mutex、 std::lock_guard<>。 另外还有 std::sh…

    C++ 2023年5月29日
    056
  • 设计模式C++实现——工厂模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大…

    C++ 2023年5月29日
    035
  • c++11新特性学习2

    noexcept 替代 throw。优点是更安全, 如果noexcept 修饰的函数抛出了异常,编辑器可以直接选择终止程序。 C++ 11中析构函数默认为noexcept(true…

    C++ 2023年5月29日
    037
  • C++ 回调函数详解

    1、什么是回调函数回调函数本质上也是普通函数,只是调用机制有所区别——首先通过传参的形式将该函数的地址传递给其他函数,然后在其他函数中通过函数指针调用该函数。在其他函数中通过函数指…

    C++ 2023年5月29日
    068
  • c++函数式编程 笔记

    函数可以看作是一个普通变量。可被存储在集合或结构中,作为参数传递给其他函数,或作为函数的返回值。高阶函数:能够 接收函数作为参数或者 返回函数作为结果的函数。 filter:过滤后…

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

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

    C++ 2023年5月29日
    037
  • Windows 8 添加隐私策略(C++版)

    well.新年上班第一天.不幸收到MS官方针对我们Snack Cards应用程序被打回消息.看看Report 内容如下: The app has declared access t…

    C++ 2023年5月29日
    058
  • C++ 使用静态链接库和动态链接库

    C++ 使用AdbHelper静态链接库 ## 必备文件:静态库AdbHelper.h,AdbHelper.lib以及动态库AdbHelper.dll ##   资源文件使用用法:…

    C++ 2023年5月29日
    047
  • c++为什么要面向对象?

    前言 c和c++的区别是什么?不可置否,最重要的就是c++的编程思想是面向对象,而c的编程思想是面向过程,这是它们的本质区别,如果你在使用c++编程时使用的还是面向过程的编程思想,…

    C++ 2023年5月29日
    054
  • 【面试攻略】C++面试-成都星合互娱

    2020-11-26-成都星合互娱 hr1.离职原因2.工作总结3.学历4.期望薪资 技术面1.自我介绍2.项目架构3.内存管理4.智能指针5.对象封装6.lua热更,热更对象的成…

    C++ 2023年5月29日
    059
  • 彻底搞懂之C++智能指针

    前言 在现代 c + + 编程中,标准库包含 智能指针,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。 标准库智能指针分类 auto_ptr, shared_pt…

    C++ 2023年5月29日
    053
  • EclipseC++学习笔记-9 将文件从项目中排除与恢复

    选中文件,取消Debug,Release勾选如果需要恢复,勾选Debug,Release即可。这样可以方便进行多个带main源码测试。 本博客是个人工作中记录,遇到问题可以互相探讨…

    C++ 2023年5月29日
    047
  • 聊聊 C++ 右值引用 和 移动构造函数

    一: 背景 最近在看 C++ 的右值引用和移动构造函数,感觉这东西一时半会还挺难理解的,可能是没踩过这方面的坑,所以没有那么大的深有体会,不管怎么说,这一篇我试着聊一下。 二: 右…

    C++ 2023年5月29日
    045
  • C++ STL std::copy 详解

    std::copy(start, end, std::back_inserter(container)); 这里,start和end是输入序列(假设有N个元素)的迭代器(itera…

    C++ 2023年5月29日
    050
  • C++多线程库的常用函数 std::lock()

    格式:函数名 + 头文件 + 用例 + 解释说明 1 函数名: 2 std::lock() 3 4 头文件: 5 #include 6 7 用例: 8 std::mutex ma,…

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