Mathematica,J / LINK,JNI,.dll

时间:2011-06-26 00:35:48

标签: java wolfram-mathematica java-native-interface jlink

我正在尝试通过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中实现这些变化可能意味着什么?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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"];