在MATLAB中从Java加载库时出现UnsatisfiedLinkError

时间:2009-11-20 18:57:45

标签: java windows dll matlab shared-libraries

我已经在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

4 个答案:

答案 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文件来扩充本机方法库的搜索路径。编辑此文件时请遵循以下准则:

  • 单独指定一行上的每个新目录。
  • 仅指定目录名称,而不指定DLL文件的名称。 LoadLibrary调用会为您执行此操作。
  • 要简化跨平台环境中目录的规范,您可以使用以下任何宏:$ matlabroot,$ arch和$ jre_home。

答案 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%并再次尝试?