那里有人使用MATLAB的javaObject()
函数和一个使用JNI的JAR文件?
我正在尝试让JHDF5运行,当它试图使用jhdf5.dll进行访问时似乎爆炸,所以我真的不知道接下来该做什么。 :(
编辑:我 NOT 尝试阅读基本的HDF5文件。我有自己的自定义Java代码,可以使用HDF5并需要JHDF5库。另外,我的第一个问题是,是否有人成功使用过它。如果没有,那么我可能正在打一场失败的战斗。如果是这样,至少它给了我希望。我将尝试调试,与在Eclipse下调试常规Java代码相比,这非常困难。
更新:好的,具体如下。我做了一个非常短的测试类,它与我复杂的程序具有相同的故障模式。看起来我的Java类由于某种原因无法访问HDF5静态常量。
我的MATLAB javaclasspath
设置为包含我的test-hdf5.jar
和Test1.java(下面),以及文件jhdf5.jar,jhdf5.dll,jhdf5obj.jar和jhdfobj.jar 。目录
源文件Test1.java:
package com.example.test.hdf5;
import ncsa.hdf.hdf5lib.H5;
import ncsa.hdf.hdf5lib.HDF5Constants;
import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException;
import ncsa.hdf.object.FileFormat;
import ncsa.hdf.object.h5.H5File;
public class Test1 {
public Test1 () {}
public static void main(String args[])
{
Test1 test = new Test1();
if (args.length < 2)
{
}
else if ("h5file".equals(args[0]))
{
test.testH5File(args[1]);
}
else if ("h5f".equals(args[0]))
{
test.testH5F(args[1]);
}
}
public void testH5File(String filename) {
H5File file;
try
{
file = (H5File) new H5File().createFile(
filename, FileFormat.FILE_CREATE_OPEN);
file.close();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public void testH5F(String filename) {
try {
int id = H5.H5Fopen(filename,
HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT);
H5.H5Fclose(id);
}
catch (HDF5LibraryException e) {
throw new RuntimeException(e);
}
catch (NullPointerException e) {
throw new RuntimeException(e);
}
}
}
MATLAB错误:
>> T=javaObject('com.example.test.hdf5.Test1')
T =
com.example.test.hdf5.Test1@c9a375
>> T.testH5F('c:/tmp/espdf/jj11copy.hdf5')
java.lang.UnsatisfiedLinkError: no jhdf5 in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at ncsa.hdf.hdf5lib.H5.<clinit>(H5.java:276)
at ncsa.hdf.hdf5lib.HDF5Constants.<clinit>(HDF5Constants.java:494)
at com.example.test.hdf5.Test1.testH5F(Test1.java:46)
Jul 23, 2009 10:38:16 AM ncsa.hdf.hdf5lib.H5 <clinit>
INFO: HDF5 library: jhdf5 resolved to: jhdf5.dll; NOT successfully loaded from java.library.path
??? Java exception occurred:
java.lang.UnsatisfiedLinkError: ncsa.hdf.hdf5lib.H5.H5dont_atexit()I
at ncsa.hdf.hdf5lib.H5.H5dont_atexit(Native Method)
at ncsa.hdf.hdf5lib.H5.<clinit>(H5.java:288)
at ncsa.hdf.hdf5lib.HDF5Constants.<clinit>(HDF5Constants.java:494)
at com.example.test.hdf5.Test1.testH5F(Test1.java:46)
>> T.testH5F('c:/tmp/espdf/jj11copy.hdf5')
??? Java exception occurred:
java.lang.NoClassDefFoundError: Could not initialize class ncsa.hdf.hdf5lib.HDF5Constants
at com.example.test.hdf5.Test1.testH5F(Test1.java:46)
>> T.testH5File('c:/tmp/espdf/jj11copy.hdf5')
??? Java exception occurred:
java.lang.NoClassDefFoundError: Could not initialize class ncsa.hdf.hdf5lib.HDF5Constants
at ncsa.hdf.object.h5.H5File.<init>(H5File.java:167)
at ncsa.hdf.object.h5.H5File.<init>(H5File.java:106)
at com.example.test.hdf5.Test1.testH5File(Test1.java:34)
如果重要,这是我正在使用的ant构建文件。 JHDF5 .jar文件和.dll位于我的lib
目录中;它们被复制到创建我自己的.jar文件的dist
目录。
<?xml version="1.0"?>
<project default="all" name="test-hdf5">
<description>some libraries to use later</description>
<property name="srcDir" location="src"/>
<property name="buildDir" location="bin"/>
<property name="distDir" location="dist"/>
<property name="libDir" location="lib"/>
<target name="init">
<tstamp/>
<mkdir dir="${buildDir}"/>
<mkdir dir="${distDir}"/>
</target>
<path id="antclasspath">
<fileset dir="${libDir}">
<include name="*.jar"/>
</fileset>
</path>
<target name="compile" depends="init">
<javac srcdir="${srcDir}"
destdir="${buildDir}"
debug="on"
target="1.6"
classpathref="antclasspath"
/>
</target>
<target name="dist" depends="compile">
<copy todir="${buildDir}">
<fileset dir="${srcDir}">
<include name="*.properties" />
</fileset>
</copy>
<copy todir="${distDir}">
<fileset dir="${libDir}">
<include name="*.dll" />
<include name="*.jar" />
</fileset>
</copy>
<jar destfile="${distDir}/test-hdf5.jar" basedir="${buildDir}"
includes="**">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="com.example.test.hdf5.Test1" />
<attribute name="Class-Path" value=". ./jhdf5.jar ./jhdfobj.jar ./jdhf5obj.jar" />
</manifest>
</jar>
</target>
<target name="all" depends="dist" />
<target name="clean" >
<delete dir="${buildDir}" />
</target>
</project>
答案 0 :(得分:2)
JHDF5在Java端使用一些愚蠢的搜索逻辑来加载dll。它可以工作,除非它没有,这通常是。与许多HDF5细节一样,基础逻辑没有记录。
我这样做了:拿走了JHDF5 Java源代码,删除了试图加载jhdf5.dll的愚蠢AI(它位于ncsa / hdf / hdf5lib / H5.java文件中,约为第230行的static
部分 - 290),并用明确的System.load("full/path/to/the/jhdf5.dll");
语句替换它。然后重新编译jhdf5.jar。也许不漂亮,但效果很好。
此外,查看源代码,似乎如果您将名为H5_LIBRARY_NAME_PROPERTY_KEY
的系统属性设置为指向dll,则可能会加载它。例如,您可以通过使用-D开关启动jvm来设置系统属性,例如:
java -DH5_LIBRARY_NAME_PROPERTY_KEY=path/to/the/jhdf5.dll -jar yourapp.jar
但是没试过。
答案 1 :(得分:2)
Matlab对此非常复杂,以上是正确的,类路径不用于dll。您可以使用如上所述的环境解决方案,但也可以使用更多MATLAB特定变量。文件librarypath.txt是能够列出包含MATLAB可用的任何dll的文件夹。它在启动时执行,因此无法动态添加。要编辑库路径,请在MATLAB命令行上运行edit librarypath.txt
。
答案 2 :(得分:0)
dll可能不在java类路径上。尝试将其目录添加到系统的PATH环境变量中。或者更好的是,只需使用hd5read / write函数。
答案 3 :(得分:0)
类路径不用于dll。它们需要位于PATH环境变量(windows)或LD_LIBRARY_PATH(linux)中。您可能还希望使用Depends(Windows,http://www.dependencywalker.com)或ldd(linux)
来验证DLL本身的相对位置和依赖性是否正确