【问题标题】:Mathematica, J/LINK, JNI, .dllMathematica、J/LINK、JNI、.dll
【发布时间】:2011-06-26 00:35:48
【问题描述】:

我正在尝试通过 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 中工作可能意味着什么方面有任何帮助?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Joshua 提供指向 MathGroup 的链接。对我来说出现的问题与那个不同。也就是说,关于 JLinkNativeLibrary(Mathgroup 讨论)的错误消息与作为标准 Mathematica-Java 通信的一部分启动 JLink 有关。那部分对我来说很好。我的问题与让 JVM 找到我的应用程序的本机库有关。对于任何想进一步关注此主题的人,我将在此处发布更多信息:java-forums.org/advanced-java/…
    【解决方案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"];
    

    【讨论】:

    • 非常有帮助的回复,我试了一下。我特别感谢您可以将其放入 Mathematica 格式(!)。请参阅上面原始消息中的效果。
    猜你喜欢
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2015-05-20
    • 1970-01-01
    相关资源
    最近更新 更多