2

我正在尝试通过 Mathematica 的 J/Link 获取 Java 方法。问题是该方法调用了一个 JNI(.dll 文件)。在命令行之外的 Mathematica 之外,一切都很好。但是在 Mathematica 中调用该方法,JVM 会返回以下内容:

Java::excptn: A Java exception occurred: java.lang.UnsatisfiedLinkError: ncsa.hdf.hdf5lib.H5.H5Fcreate(Ljava/lang/String;III)I
    at ncsa.hdf.hdf5lib.H5.H5Fcreate(Native Method)
    at ncsa.hdf.object.h5.H5File.createFile(H5File.java:920)
    at H5FileCreateFromMathematica.H5FileCreate(H5FileCreateFromMathematica.java:38).

我花了很多时间试图通过各种排列的类路径和路径来正确处理所有事情。这可能仍然是问题,尽管我觉得我已经努力排除这些可能性。

任何关于 (1) 来自 Java 的消息的含义以及更好的 (2) 如何修复它的见解将不胜感激。

  • 编辑:更多信息,在实施 Artefacto 非常有用的建议后 * Artefacto 输入的结果是错误消息的更改。在第一次调用时, fileFormat@create["C:\Test"] 产生:

Java::excptn: A Java exception occurred: java.lang.UnsatisfiedLinkError: Native Library C:\MyJava\hdf-java\lib\win\jhdf5.dll already loaded in another classloader at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1772) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1732) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1028) at ncsa.hdf.hdf5lib.H5.<clinit>(H5.java:232) at ncsa.hdf.object.h5.H5File.createFile(H5File.java:920) at ncsa.hdf.object.FileFormat.create(FileFormat.java:1472).

再次立即调用, fileFormat@create["C:\Test"] 产生:

Java::excptn: A Java exception occurred: java.lang.NoClassDefFoundError: Could not initialize class ncsa.hdf.hdf5lib.H5 at ncsa.hdf.object.h5.H5File.createFile(H5File.java:920) at ncsa.hdf.object.FileFormat.create(FileFormat.java:1472).

对解释这些变化有什么帮助,以及让它在 Mathematica 中工作可能意味着什么?

4

2 回答 2

2

Java 正在寻找本机库,但没有找到。根据下面链接的论坛帖子,您应该设置“com.wolfram.jlink.libdir”系统属性或 JLINK_LIB_DIR 环境变量。这可能是在配置它应该在哪里查找 JLink 本身,因此您也可以尝试将所需的库放置在 Mathematica 安装布局中 JLinkNativeLibrary.dll 文件所在的位置。

这是相关的论坛主题: http ://forums.wolfram.com/mathgroup/archive/2008/Aug/msg00664.html

于 2011-06-26T01:12:19.983 回答
2

尝试在命令行中向 JVM 传递 dll 目录的路径,如下所示:

InstallJava[CommandLine-> "c:\\path\\to\\java.exe -Djava.library.path=c:\\path\\to\\libdirectory"]

然后调用Runtime.getRuntime().loadLibrary("mylib");

LoadJavaClass["java.lang.Runtime"];
runtime = java`lang`Runtime`getRuntime[];
process = runtime@loadLibrary["mylib"];
于 2011-06-26T01:13:23.727 回答