代码之家  ›  专栏  ›  技术社区  ›  Adam Holmberg

Matlab中从Java加载库时的不满意链接错误

  •  5
  • Adam Holmberg  · 技术社区  · 15 年前

    我已经将简单Java模块集成到Windows环境下的Matlab环境中,取得了一些成功。最近我遇到了一个第三方库的问题,它试图加载一个DLL。

    Java类加载器在尝试加载时抛出不满足的Link错误:

    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的目录中,而DLL确实可以工作。

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

    平台: 视窗XP MATLAB R200 9A 爪哇1.6

    4 回复  |  直到 12 年前
        1
  •  4
  •   jitter    15 年前

    你熟悉吗 Process Monitor 是吗?(如果不是的话,你很容易就会知道它是如何工作的)。

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

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

    现在,执行ctrl+f并搜索它应该加载的dll的名称。检查(可能是多个)条目,在结果列中注明“找不到”或“找不到名称”,在路径列中注明dll名称。

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

        2
  •  4
  •   Adam Holmberg    15 年前

    在Matlab文档中发现了这个:

    指定Sun Java本地方法DLL的搜索路径

    Matlab用来定位Java所需的本地方法库的机制已经发生了变化。Matlab不再使用系统环境变量来定义这些库的路径。

    兼容性注意事项

    如果您目前依赖路径(用于Windows)或ld_library_path(用于Unix)环境变量来实现此目的,则需要使用文件library path.txt,如下所述。

    指定Java库路径

    Java类可以使用Java方法Java.Lang.Stase.Load LooCube(“LIbFrm”)动态加载本机方法。为了使JVM软件定位指定的库文件,包含它的目录必须在Java库路径上。此路径是在matlab启动时启动jvm软件时建立的,它基于文件的内容

    $matlab/toolbox/local/librarypath.txt(英文)

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

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

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

    将尝试使用java.lang.system.loadlibrary加载的dll放入以下目录: $MatabRoo\\sys \java\jRe\Win??\jre\bin\

        4
  •  0
  •   bm212    15 年前

    您的库是否依赖其他DLL?可能是由于DLL Java加载它的LoopRealBug()调用,所以需要其他DLL。在Windows上,我相信它会在%path%上查找这些DLL。

    这并不是严格意义上的Java事务,而是与正在加载的本机库有关。 Java被告知通过Java.Labal.PATH(或者其他任何Matlab使用的机制)来查找DLL,并且LBNAME.DLL将使用%PATH %来查找它依赖的任何DLL。

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