我已经将简单的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属性中。 我已经validation该属性确实具有正确的path,并且该path上存在libname.dll文件。
我用两种方法validation了java.library.path。 首先,我只是检查在MATLAB命令行上返回的值:
多余的图书馆联系
如何在共享库(.so)中使用共享库的同一进程的实例共享全局variables?
删除符号链接libc.so.6后如何恢复?
编译共享库到程序中?
查找符号时,程序不会从正确的库中search
>> java.lang.System.getProperty('java.library.path')
然后,我修改了有问题的java方法,在调用失败的第三方函数之前打印该值:
System.out.println(System.getProperty('java.library.path'));
两人都证实我的path值是按照预期设定的。
我也尝试从命令行手动加载库,它失败了相同的结果。
这是不是在MATLAB中可能的东西,或者我在这里错过了什么? 不幸的是,我不是这台机器上的pipe理员,所以我不能尝试将dll移动到一个可以工作的dll的目录中。
如果没有绝对的答案,我欢迎任何build议。
平台:Windows XP MATLAB R2009a Java 1.6
编译libstdc ++版本与系统版本
加载共享库时出错:libevent-1.4.so.2:无法打开共享目标文件:
从64位应用程序使用32位共享库?
我怎样才能共享两个程序之间的图书馆c
Linux相当于Windows DLL转发器或MacOS reexport_library
你熟悉Process Monitor吗? (如果没有,你会很容易得到它的工作原理)。
下载它。 运行。 只要启用“显示文件系统活动”(菜单栏右下方的小图标),禁用其他。
然后启动任何导致图书馆尝试加载DLL的东西。 在发生UnsatisfiedLinkError之后,停止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 /工具箱/本地/ librarypath.txt
(其中$ matlab是由MATLAB关键字matlabroot表示的MATLAB根目录)。
您可以通过编辑librarypath.txt文件来扩充本地方法库的搜索路径。 编辑此文件时请遵循以下准则:
自己指定每个新的目录。
只指定目录名称,而不是DLL文件的名称。 LoadLibrary调用为你做这个。
为了简化跨平台环境中目录的规范,您可以使用以下任何宏:$ matlabroot,$ arch和$ jre_home。
将您尝试使用java.lang.System.loadLibrary加载的DLL放到以下目录中:$ matlabroot sys java jre win ?? jre bin
你的图书馆是否依赖于其他dll? 可能是因为它的loadLibrary()调用需要其他dll的结果加载的dll java。 在Windows上,我相信它会在%PATH%上查找这些dll。
这不是严格的java事情; 这与你正在加载的本地库有关。 Java通过java.library.path(或者Matlab使用的任何其他机制)被告知在哪里找到dll,而libname.dll将使用%PATH%来查找它依赖的任何dll。
正如你所说缺少的dll在你的java.library.path中,也许你可以尝试将java.library.path的值附加到%PATH%然后再试一次?