Dav*_*ave 0 java dll java-native-interface
我在 Java 加载本机 dll 时遇到问题,因为它发生在 64 位 Windows 7 上。FWIW 包是 ZeroMQ,但重要的是该 jar 需要加载本机 dll,称为 jzmq.dll。这又取决于 libzmq.dll (和一些标准库)。我已将两个 dll 复制到 target/lib 并设置java.language.path
为 target/lib。
如果我写:
System.loadLibrary("jzmq");
Run Code Online (Sandbox Code Playgroud)
我得到UnsatisfiedLinkError
一个Can't find dependent libraries
. 但是如果我说
System.loadLibrary("libzmq");
System.loadLibrary("jzmq");
Run Code Online (Sandbox Code Playgroud)
然后就没问题了,jzmq.dll加载成功。
在随附的 jar 中,它就包含在内System.loadLibrary("jzmq")
,我不想在代码中摆弄依赖项。我不清楚为什么依赖项不会自动加载,也不清楚我需要做什么才能让它正常工作。
预先感谢您的任何帮助!
库的依赖关系由操作系统而不是 Java 运行时解决。当您设置java.library.path
目录时,Java 运行时知道在哪里查找库,但操作系统仍然找不到依赖项。为了让 Windows 找到您的库,您必须在PATH
环境变量中设置您的目录。
PS:当您首先加载依赖库时它起作用的原因是,它随后将位于进程的地址空间中,Windows会在那里找到它,而无需在文件系统中找到它
PPS:有文章说,如果将依赖库放在同一目录中,Windows 上会自动找到它们,这只说了一半的事实。这样做的原因是a)他们谈论的是可执行文件的依赖关系,而不是其他库,b)当您在没有显式工作目录的情况下启动可执行文件时,工作目录将是其中包含可执行文件的目录,并且Windows会自动添加将工作目录添加到搜索路径(因此将找到位于同一目录中的库)。