为什么2路径加载库JNA

问题描述 投票:0回答:1

你好,这是我的代码。

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个PATH(不明白,因为添加一个图像,我只有一个Path)的操作系统,一个用于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,我有错误的消息。没有找到......对不起,我的英语。

java jna
1个回答
2
投票

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

让你的目标库在你的Java程序中可用。有几种方法可以做到这一点。

  • 首选的方法是将目标库的 jna.library.path 系统属性到目标库的路径。这个属性类似于 java.library.path,但只适用于JNA加载的库。
  • 在启动虚拟机之前,请更改相应的库访问环境变量。这就是 PATH 在Windows上。LD_LIBRARY_PATH 在Linux上,以及 DYLD_LIBRARY_PATH 在OSX上。
  • 在你的classpath中,将你的本机库设置为可用,路径为 {OS}-{ARCH}/{LIBRARY},其中 {OS}-{ARCH} 是JNA对本地库(如win32-x86、linux-amd64或darwin)的规范前缀。如果资源在一个jar文件中,它将在加载时被自动提取。

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

然而,对于你要分发给用户的代码,你不希望依赖一个绝对的文件路径。 把库放在一个标准的相对路径位置要好得多:一个叫做 resources 路径(src/main/resources 如果使用Maven),执行时将在你(或任何用户)的classpath中可用。 这似乎与你的代码中被注释掉的 Windows 分支一致,它将在你的 win32-x86 子目录下的 resources 文件夹中。

你可能已经告诉你的IDE在classpath中添加了一些东西(所以它在那里工作),但如果它不在标准位置,它可能在jar中失败。

我不知道为什么你的代码的macOS分支没有把资源放在 darwin 子目录,但它可能应该。

© www.soinside.com 2019 - 2024. All rights reserved.