Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中从Java加载库时出现不满意的链接错误_Java_Windows_Dll_Matlab_Shared Libraries - Fatal编程技术网

在MATLAB中从Java加载库时出现不满意的链接错误

在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模块集成到Windows上的MATLAB环境中,并取得了一些成功。最近,我遇到了一个第三方库的问题,该库试图加载dll

java类加载器在尝试加载时抛出UnsatifiedLink错误:

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'));