Mathematica, J/LINK, JNI, .dll



我正试图通过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)如何修复它,我们将不胜感激。

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

Java::excptn: A Java exception occurred: java.lang.UnsatisfiedLinkError: Native Library C:MyJavahdf-javalibwinjhdf5.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的工作可能意味着什么?

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

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

尝试在命令行中传递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"];

最新更新