IDEA 使用 JNA 时,DLL 文件路径问题

1. 问题描述

因工作需要调用第三方提供的 SDK 中的 DLL,所以使用了 JNA 技术。开发步骤及 JNA 的使用方法都已经熟悉了,开发任务也已经完成,但是这中间一直有个问题比较疑惑:IDEA 中 DLL 文件的存放路径,究竟应该放在哪里?

2. 尝试

首先介绍一下项目的目录情况:

开发工具:IDEA JDK 1.8 32bit
目录:   ---根目录
         --- ... 省略
         --- lib(在 Modules 的 Dependencies 中已设置为 lib 目录)
         --- src (设置为 Sources 目录)
         --- ... 省略

第三方提供的 DLL 是 32bit,最终是成功的调用了第三方的 DLL 实现了需求,所以排除了位数不兼容的问题。

  1. 项目的 lib 目录:

    Caused by: java.lang.UnsatisfiedLinkError: Unable to load library 'dllName': 
    Native library (win32-x86/dllName.dll) not found in resource path 
    ([file:/C:/Program%20Files%20(x86)/Java/jdk1.8.0_171/jre/lib/charsets.jar, 
    ......

    报错如上,报错中有两种路径,我都尝试过将 DLL 文件防止在对应目录下,结果报错依旧

  2. 项目的 src 目录:
    放在 src 目录,经测试能够正常加载 DLL 文件,由于项目的目录结构原因,放在 src 目录下肯定是不行的,最理想的是放在 lib 目录
  3. 放在 C:Program Files (x86)Javajdk1.8.0_171jrebin 目录:
    放在该目录下也是可以正常加载 DLL 文件的
  4. 放在 C:WindowsSystem32 目录:
    SDK 开发文档上说可以尝试将 DLL 文件放在该目录下,但是在 IDEA 上测试无效。
  5. 修改 IDEA 运行配置中的 VM option 为:-Djava.library.path=D:\***\lib

    图片描述

    该方法也没什么用

  6. 使用绝对路径
    使用绝对路径也没有正确加载 DLL 文件,而且绝对路径也不符合要求

3. 想问的问题:

在 IDEA 中应该如何设置 DLL 文件的路径(除了 src 目录),另外在 IDE 环境之外,如何处理才能保证程序在运行时能正确加载 DLL 文件?

阅读 24.6k
1 个回答
新手上路,请多包涵

只管根据库名加载动态链接库的话:

先说下jni,jni加载动态链接库只会从JVM系统属性java.library.path所设置的路径去取,而windows、linux、mac下这个变量默认值是不一样的,如果要自定义路径,在windows中最简单,在PATH中追加即可,而mac以及linux就没有这么简单了,原本也可以通过设置系统变量如LD_LIBRARY_PATH来向java.library.path追加路径,但在某些系统已经把该变量给废弃了,所以mac和linux建议通过-Djava.library.path=xxx来设置自定义库路径。

JNA的话,默认从系统库中去查找,windows下跟JNI一样,PATH中追加即可。而在linux和mac下需要通过-Djna.library.path=xxx来配置,当然你也可以设置成全局库,以ubuntu为例:新建文件 /etc/ld.so.conf.d/xxx.conf, xxx.conf添加自定义库路径,最后运行命令 sudo ldconfig即可。

这样设置的话,就不需要关心开发工具的影响。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题