在MATLAB中从Java加载库时出现不满意的链接错误
我一直在将简单的java模块集成到Windows上的MATLAB环境中,并取得了一些成功。最近,我遇到了一个第三方库的问题,该库试图加载dll java类加载器在尝试加载时抛出UnsatifiedLink错误:在MATLAB中从Java加载库时出现不满意的链接错误,java,windows,dll,matlab,shared-libraries,Java,Windows,Dll,Matlab,Shared Libraries,我一直在将简单的java模块集成到Windows上的MATLAB环境中,并取得了一些成功。最近,我遇到了一个第三方库的问题,该库试图加载dll java类加载器在尝试加载时抛出UnsatifiedLink错误: java.lang.UnsatisfiedLinkError: no <libname> in java.library.path at java.lang.ClassLoader.loadLibrary(Unknown Source) at java.lang.Runt
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)
然后,我修改了相关的java方法,在调用失败的第三方函数之前打印该值:
System.out.println(System.getProperty('java.library.path'));
两者都确认我的路径值设置为预期值
我还尝试从命令行手动加载库,但失败了,结果相同
这在MATLAB中是不可能的,还是我遗漏了什么?不幸的是,我不是这台机器的管理员,所以我不能尝试将dll移动到具有dll的目录中的老把戏
如果没有绝对的答案,我欢迎任何关于尝试的建议
站台:
视窗XP
MATLAB R2009a
Java 1.6你熟悉吗?(如果不是这样,您将很容易了解它的工作原理)
下载它。运行它。只需启用“显示文件系统活动”(菜单栏右下方的小图标),禁用其他活动
然后启动导致库尝试加载dll的任何程序。发生未满足链接错误后,停止Process Monitor中的事件捕获
现在执行CTRL+F并搜索它应该加载的dll的名称。检查结果列中显示“未找到”或“未找到名称”的(可能有多个)条目,并在路径列中使用dll名称
现在检查它在哪里查找dll。可能它附加了一些附加路径或类似路径,因此无法找到它。刚刚在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
您的库是否依赖于其他DLL?可能是java加载dll是因为其loadLibrary()调用需要其他dll。在Windows上,我相信它将在%PATH%上查找这些DLL
严格来说,这并不是java的事情;这更多地与您正在加载的本机库有关。
Java通过Java.library.path(或Matlab使用的任何其他机制)被告知在何处查找dll,libname.dll将使用%path%查找它所依赖的任何dll
正如您所说,缺少的dll位于java.library.path中,也许您可以尝试将java.library.path值附加到%path%并重试?将尝试使用java.lang.System.loadLibrary加载的dll放入以下目录:
$matlabroot\sys\java\jre\win???\jre\bin\您如何验证java.library.path属性的值?@matt b:我在帖子中添加了详细信息以回答您的问题。您能看到第三方代码试图加载的库吗(通过查看源代码)?是不是与未满足链接错误中报告的库相同?这是一个很好的建议,但不幸的是,这是一台安全的计算机--我将无法安装或运行未经批准的第三方应用程序。有没有一种方法可以通过检测代码来完成同样的事情(除了简单地确认前面提到的路径属性之外)?同时有趣又奇怪。他们为什么要做这么奇怪的事哇,这真管用!但是,为什么在添加java.library.path时这会起作用呢??
System.out.println(System.getProperty('java.library.path'));