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

Ada*_*erg 5 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)
Run Code Online (Sandbox Code Playgroud)

例外是报告我的'libname'不在java.library.path属性中.我已经验证该属性确实具有正确的路径,并且该路径上存在libname.dll文件.

我用两种方式验证了java.library.path.首先,我只是检查了MATLAB命令行返回的值:

>> java.lang.System.getProperty('java.library.path')
Run Code Online (Sandbox Code Playgroud)

然后,我修改了有问题的java方法,在调用失败的第三方函数之前打印该值:

System.out.println(System.getProperty('java.library.path'));
Run Code Online (Sandbox Code Playgroud)

两者都确认我的路径值已按预期设置.

我也尝试从命令行手动加载库,它失败并得到相同的结果.

这是MATLAB中无法实现的,还是我在这里遗漏了什么?不幸的是我不是这台机器的管理员,所以我不能尝试将dll移动到一个dll可以正常运行的目录中的老技巧.

如果没有绝对的答案,我欢迎任何有关事情的建议.

平台:Windows XP MATLAB R2009a Java 1.6

jit*_*ter 5

您熟悉进程监视器吗?(如果没有,您将很容易了解它是如何工作的)。

下载它。运行。只需启用“显示文件系统活动”(菜单栏右侧的小图标),禁用其他功能。

然后启动任何导致库尝试加载 dll 的程序。发生后UnsatisfiedLinkError,停止Process Monitor中的事件捕获。

现在按 CTRL+F 并搜索它应该加载的 dll 的名称。检查结果列中显示“未找到”或“未找到名称”的(可能是多个)条目以及路径列中的 dll 名称。

现在检查它真正在哪里寻找 dll。也许它附加了一些额外的路径或类似的路径,因此无法找到它。


Ada*_*erg 5

刚刚在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 / toolbox / local / librarypath.txt

(其中$ matlab是由MATLAB关键字matlabroot表示的MATLAB根目录)。

您可以通过编辑librarypath.txt文件来扩展本机方法库的搜索路径。编辑此文件时,请遵循以下准则:

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