PDA

查看完整版本 : MATLAB + JNI =错误?


poster
2019-12-10, 16:49
有人在那里使用MATLAB的javaObject()函数和使用JNI的JAR文件吗?

我正在尝试使JHDF5运行,当它尝试使用jhdf5.dll进行访问时似乎炸弹,所以我真的不知道下一步该怎么做。 :(

编辑 :我不试图读取基本的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.(H5.java:276) at ncsa.hdf.hdf5lib.HDF5Constants.(HDF5Constants.java:494) at com.example.test.hdf5.Test1.testH5F(Test1.java:46) Jul 23, 2009 10:38:16 AM ncsa.hdf.hdf5lib.H5 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.(H5.java:288) at ncsa.hdf.hdf5lib.HDF5Constants.(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.(H5File.java:167) at ncsa.hdf.object.h5.H5File.(H5File.java:106) at com.example.test.hdf5.Test1.testH5File(Test1.java:34) 万一重要,这是我正在使用的ant构建文件。 JHDF5 .jar文件和.dll在我的lib目录中;它们被复制到创建我自己的.jar文件的dist目录中。

some libraries to use later
回答:
JHDF5在Java端使用一些愚蠢的搜索逻辑来加载dll。它可以正常工作,除非不能正常工作。与许多HDF5细节一样,底层逻辑也没有记录。

我这样做了:取得了JHDF5 Java源代码,删除了试图加载jhdf5.dll的愚蠢AI(位于ncsa / hdf / hdf5lib / H5.java文件中,位于第230-290行中的static部分),并替换为一个显式的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 不过没有尝试。



更多&回答... (https://stackoverflow.com/questions/1168567)