你好,这是我的代码。
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(依赖于一些本地代码)在不同的操作系统上必然有不同的表现。 特别是在加载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
子目录,但它可能应该。