我已经在Windows上将简单的java模块集成到MATLAB环境中并取得了一些成功。最近我遇到了第三方库试图加载DLL的问题。
java ClassLoader在尝试加载时抛出UnsatisfiedLinkError:
java.lang.UnsatisfiedLinkError: no <libname> in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
异常是报告我的'libname'不在java.library.path属性中。我已经验证该属性确实具有正确的路径,并且该路径上存在libname.dll文件。
我以两种方式验证了java.library.path。首先,我只是检查了MATLAB命令行返回的值:
>> java.lang.System.getProperty('java.library.path')
然后,我修改了有问题的java方法,在调用失败的第三方函数之前打印该值:
System.out.println(System.getProperty('java.library.path'));
两者都确认我的路径值已按预期设置。
我还尝试从命令行手动加载库,但失败的结果相同。
这是MATLAB中无法实现的,还是我在这里遗漏了什么?不幸的是,我不是这台机器的管理员,所以我不能尝试将dll移动到一个有效的dll目录的旧技巧。
如果没有绝对的答案,我欢迎任何有关事情的建议。
平台: Windows XP MATLAB R2009a Java 1.6
答案 0 :(得分:4)
您熟悉Process Monitor吗? (如果不是,你会很容易得到它的工作方式)。
下载它。运行。只需启用“显示文件系统活动”(菜单栏下方的小图标),禁用其他图标。
然后启动库导致尝试加载dll的原因。发生UnsatisfiedLinkError
后,在Process Monitor中停止事件捕获。
现在执行CTRL + F并搜索应加载的dll的名称。检查(可能是多个)条目,在结果列中输入“Not Found”或“Name not found”,并在路径列中输入dll-name。
现在检查它真正寻找dll的位置。也许它附加了一些额外的路径或类似的东西,因此无法找到它。
答案 1 :(得分:4)
刚在MATLAB文档中找到了这个:
指定Sun Java本机方法DLL的搜索路径
MATLAB用于定位Java所需的本机方法库的机制已发生变化。 MATLAB不再使用系统环境变量来定义这些库的路径。
兼容性注意事项
如果您目前依赖于PATH(对于Windows)或LD_LIBRARY_PATH(对于UNIX)环境变量,则需要使用文件librarypath.txt,如下所述。
指定Java库路径
Java类可以使用Java方法java.lang.System.loadLibrary(“LibFile”)动态加载本机方法。为了使JVM软件找到指定的库文件,包含它的目录必须位于Java库路径上。 MATLAB在启动时启动JVM软件并基于文件内容
时建立此路径$ MATLAB /工具箱/本地/ librarypath.txt
(其中$ matlab是由MATLAB关键字matlabroot表示的MATLAB根目录)。
您可以通过编辑librarypath.txt文件来扩充本机方法库的搜索路径。编辑此文件时请遵循以下准则:
答案 2 :(得分:1)
将您尝试使用java.lang.System.loadLibrary加载的DLL放入以下目录: $ matlabroot \ SYS \ java的\ JRE \赢?? \ JRE \ BIN \
答案 3 :(得分:0)
你的图书馆是否依赖其他dll?可能是因为loadLibrary()调用需要其他dll而导致dll java加载。在Windows上,我相信它会在%PATH%上试图找到这些dll。
这不是严格意义上的java事物;它更多地与您正在加载的本机库有关。 Java被告知通过java.library.path(或Matlab使用的任何其他机制)在哪里找到dll,libname.dll将使用%PATH%来查找它所依赖的任何dll。
正如您所说缺少的dll在您的java.library.path中,也许您可以尝试将java.library.path值附加到%PATH%并再次尝试?