首页 > 解决方案 > 为什么 2 加载库 JNA 的路径

问题描述

你好这是我的代码:

if (isWindows()) {
            //System.setProperty("jna.library.path", getClass().getResource("/resources/win32-x86").getPath());//netbeans WinOs
                        System.setProperty("jna.library.path", System.getProperty("user.dir").toString()+File.separator+"Desktop");//compiler WinOs
        } else if (isMac()) {
            //System.setProperty("jna.library.path", getClass().getResource("/resources").getPath());//netbeans MacOs
                        System.setProperty("jna.library.path", System.getProperty("user.dir").toString()+File.separator+"Desktop");//compiler MacOs
        } else {
            System.out.println("Your OS is not support!!");
        }

为什么我有 2 路径(不明白,因为添加图像我只有一个路径)由操作系统,一个用于 IDE,另一个用于 .JAR ?

我刚刚意识到,当我使用 Windows 并运行项目(来自 netbeans)时,“库”加载并获得了信息,但是当我编译并启动我的 .jar 时,我得到了错误:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: %1 is not a valid Win32 application.

我的结构

它是正确的?

在 mac 上只能使用这个命令:java -jar "/System/Volumes/Data/Users/hugoclo/NetBeansProjects/Prezauto/dist/Prezauto.jar"因为终端。如果单击 jar 我有消息错误:未找到.....对不起我的英语,

标签: javajna

解决方案


“为什么”可能有两个原因。虽然 Java 是跨平台的,但 JNA(依赖于一些本机代码)在不同的操作系统上必须表现不同。特别是在加载 DLL (Windows) 或动态库 (OSX) 的情况下,您不想混搭。因为可能会为不同的操作系统编译具有相同名称的 dll,所以 JNA 的入门页面确定了这些库的标准位置:

使您的目标库可用于您的 Java 程序。做这件事有很多种方法:

  • 首选方法是将jna.library.path系统属性设置为目标库的路径。此属性类似于java.library.path,但仅适用于 JNA 加载的库。
  • 在启动 VM 之前更改适当的库访问环境变量。这是PATH在 Windows、LD_LIBRARY_PATHLinux 和DYLD_LIBRARY_PATHOSX 上。
  • 使您的本机库在您的类路径中可用,在 path 下{OS}-{ARCH}/{LIBRARY}{OS}-{ARCH}JNA 的本机库规范前缀在哪里(例如 win32-x86、linux-amd64 或 darwin)。如果资源在 jar 文件中,加载时会自动提取。

在您的代码中,您似乎正在尝试执行第一个选项(设置jna.library.path)以包含用户的桌面。这对测试很好,对生产不利,并且可能是您编译的 jar 找不到它的原因。此外,通过设置此变量,您将覆盖它之前的任何(默认)位置。如果你想走这条路线,你应该复制保存的位置,然后将你自己的附加路径附加到它。

但是,对于您将分发给用户的代码,您不希望必须依赖绝对文件路径。最好将库放在标准的相对路径位置:执行时在您(或任何用户的)类路径上可用的resources路径(如果使用 Maven)。src/main/resources这似乎与代码的注释掉的 Windows 分支一致,它将在文件夹的win32-x86子目录中查找resources

您可能已经告诉您的 IDE 向类路径添加一些内容(因此它可以在那里工作),但如果它不在标准位置,它可能会在 jar 中失败。

我不确定为什么代码的 macOS 分支没有将资源放在darwin子目录中,但它可能应该。


推荐阅读