首页 > 解决方案 > JNA:在编译的 jar 中找不到指定的模块

问题描述

我的 java Spring Boot 项目中有一个 C++ .dll。一切看起来都很好,并且在.dll以下情况下调用方法:

  1. 我从 IDE 运行应用程序
  2. 我编译文件mvn pack & java -jar target/Project-0.0.1-SNAPSHOT.jar

我试图将项目复制到另一台机器上,但我遇到了这个问题:

  1. 当我从 IDE 运行应用程序时,一切正常

  2. 当我在项目上运行相同的命令mvn pack & java -jar target/Project-0.0.1-SNAPSHOT.jar并且它被称为.dll方法时,它会因消息错误而崩溃:

java.lang.UnsatisfiedLinkError: The specified module could not be found.

    at com.sun.jna.Native.open(Native Method) ~[jna-4.1.0.jar!/:4.1.0 (b4)]
    at com.sun.jna.Native.open(Native.java:1759) ~[jna-4.1.0.jar!/:4.1.0 (b4)]
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260) ~[jna-4.1.0.jar!/:4.1.0 (b4)]
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398) ~[jna-4.1.0.jar!/:4.1.0 (b4)]
    at com.sun.jna.Library$Handler.<init>(Library.java:147) ~[jna-4.1.0.jar!/:4.1.0 (b4)]
    at com.sun.jna.Native.loadLibrary(Native.java:412) ~[jna-4.1.0.jar!/:4.1.0 (b4)]`.

注意:我在两台机器上都有 Microsoft Visual C++ 2017 Redistributable。

如果我在项目根目录中移动 .dll 文件,它就可以工作。

标签: javac++dlljava-native-interfacejna

解决方案


您在项目中使用 JNA。JNA 需要正确安装一些本机库。例如,它需要jnidispatch.dllWindows 平台。

对于您的情况,您需要下载所需的原生库,例如https://github.com/java-native-access/jna/blob/master/lib/native/win32,并将其放入可以搜索的目录中通过你的 JAVA。


推荐阅读