Mathematica, J/LINK, JNI, .dll
Я пытаюсь заставить метод Java работать через J/Link от Mathematica. Проблема в том, что метод вызывает 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).
Я потратил много времени, пытаясь все сделать правильно с помощью classpath и path в различных перестановках. Это все еще может быть проблема, хотя я чувствую, что я упорно трудился, чтобы исключить эти возможности.
Любое понимание (1), что означает это сообщение от Java, и даже лучше (2), как его исправить, будет высоко ценится.
- РЕДАКТИРОВАТЬ: ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ, после реализации очень полезного предложения Артефакто * Результатом ввода Артефакто является изменение в сообщении об ошибке. При первом вызове 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 ответа
Попробуйте передать 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"];
Java ищет собственную библиотеку, но не находит ее. Согласно сообщению на форуме, указанному ниже, вы должны установить системное свойство "com.wolfram.jlink.libdir" или переменную среды JLINK_LIB_DIR. Это может быть настройка того, где искать сам JLink, поэтому вы можете также попытаться поместить нужную библиотеку, в которой находится файл JLinkNativeLibrary.dll, в установочный макет Mathematica.
Это связанная ветка форума: http://forums.wolfram.com/mathgroup/archive/2008/Aug/msg00664.html