【问题标题】:UnsatisfiedLinkError When Loading a Library from Java in MATLAB在 MATLAB 中从 Java 加载库时出现 UnsatisfiedLinkError
【发布时间】:2009-11-20 18:57:45
【问题描述】:

我一直在将简单的 java 模块集成到 Windows 上的 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 的目录的旧技巧。

如果没有绝对答案,我欢迎任何关于尝试的建议。

平台: 视窗 MATLAB R2009a Java 1.6

【问题讨论】:

  • 如何验证 java.library.path 属性的值?
  • @matt b:我在帖子中添加了详细信息以回应您的问题。
  • 你能看到第三方代码试图加载的库(通过查看源代码)吗?是否与 UnsatisfiedLinkError 中报告的库相同?

标签: java windows dll matlab shared-libraries


【解决方案1】:

刚刚在 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。

【讨论】:

  • 既有趣又奇怪。为什么他们会做这么奇怪的事情
【解决方案2】:

你熟悉Process Monitor吗? (如果没有,您将很容易了解它是如何工作的)。

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

然后启动任何导致库尝试加载 dll 的内容。在UnsatisfiedLinkError 发生后,停止进程监视器中的事件捕获。

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

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

【讨论】:

  • 这是一个很好的建议,但不幸的是,这是一台安全的计算机——我将无法安装或运行未经批准的第三方应用程序。有没有办法通过检测代码来完成同样的事情(除了简单地确认路径属性,如所述)?
【解决方案3】:

将您尝试使用 java.lang.System.loadLibrary 加载的 DLL 放入以下目录: $matlabroot\sys\java\jre\win??\jre\bin\

【讨论】:

  • 哇,这成功了!但是为什么在添加 java.library.path 时这行不通呢??
【解决方案4】:

您的库是否依赖于其他 dll?可能是由于其 loadLibrary() 调用需要其他 dll 而加载 dll java。在 Windows 上,我相信它会在 %PATH% 上查找这些 dll。

这不是严格意义上的 java 东西;它更多地与您正在加载的本机库有关。 通过 java.library.path(或任何其他 Matlab 使用的机制)告诉 Java 在哪里可以找到 dll,并且 libname.dll 将使用 %PATH% 来查找它所依赖的任何 dll。

正如您所说,缺少的 dll 在您的 java.library.path 中,也许您可​​以尝试将 java.library.path 值附加到 %PATH% 并重试?

【讨论】:

    猜你喜欢
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多