【问题标题】:Native.loadLibrary() returns null when project is a gradle dependency当项目是 gradle 依赖项时,Native.loadLibrary() 返回 null
【发布时间】:2018-12-08 01:31:48
【问题描述】:

在 JNA 的帮助下实现了一个利用 .dll 文件的 java 驱动程序项目。当我构建和运行时,它作为一个项目工作得很好。但是,当这个驱动程序项目被 jarred 并成为另一个更大项目的依赖项时,我无法加载 .dll 文件。

我正在使用Native.loadLibrary(LIBRARY_NAME, MY_INTERFACE.class) 语法将库加载到驱动程序项目中。此行成功将我的库加载到驱动程序项目中,但当它是另一个项目的依赖项时返回 null。如何调试并找出问题所在?

重现此行为:

OS: Windows 10 IDE: Intellij Community 2018.2 Java: 1.8.0_191 driver project: https://github.com/ClearControl/GS16AO64c parent project: https://github.com/AhmetCanSolak/clearcontrol

【问题讨论】:

  • 尝试将dll移动到resources目录,然后使用Native.extractFromResourcePath将其解压到文件系统,然后将File的路径传递给loadLibrary
  • 嗯,实际上,查看loadLibrary 的源代码,它试图将其作为最后的手段。如果将 DLL 移动到资源目录的根目录并使用 /dll-name.dll 加载库,它可以工作吗?
  • Native.extractFromResourcePath() 需要我们在接口文件中没有的 try/catch 块。
  • 我尝试将lib.win64包中的dll和lib文件移动到资源根目录下,但是仍然没有解决问题。
  • 我仍然能够在驱动程序项目中运行测试,但是,我无法从父项目调用驱动程序作为 gradle 依赖项。

标签: java windows intellij-idea dll jna


【解决方案1】:

我终于解决了我的问题。 JNA 的 Native.loadLibrary() 无法从 jar 访问任何非类元素。我将资源 .dll 文件复制到临时文件中并首先加载它们:

System.load(tmpFile.getAbsolutePath());

然后使用Native.loadLibrary()。这样就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    相关资源
    最近更新 更多