6

如何在 Android 上使用HDF5 软件?可以为 Android 平台编译原生 C++ 库,然后使用 HDF5 Java 绑定调用吗?

4

3 回答 3

2

您不能(轻松)使用 Android 的交叉编译器进行编译

如果你想让它工作,你需要在 ARM 设备上编译,特别是 Android 工具链。老实说,不要在 NDK 项目中使用 HDF5,因为即使您设法生成了二进制文件,它也不受支持。

我继续尝试使用 NDK-CMake-gradle 对其进行编译,但它无法确定各种类型的大小。我以前见过这种行为,它通常需要将可执行文件上传到模拟器或设备,运行它并读回结果。不酷。

根据他们自己的FAQ

不,HDF5 中的交叉编译存在两个问题。

首先,HDF5 在几个地方使用了 AC_TRY_RUN。这个宏试图编译和运行一个测试程序,但这不适用于交叉编译,因为它为主机系统构建程序,并试图在构建系统上运行它。为了解决这个问题,需要将宏替换为非动态测试(即,在不执行测试程序的情况下确定正确的设置),或者用一个参数修改每个 AC_TRY_RUN,告诉它在交叉编译时要做什么(这将可能意味着为交叉编译设置一个悲观的默认值)。

其中许多 AC_TRY_RUN 实例用于检查编译器功能。例如,HDF5 通过运行测试程序来检查 Fortran 编译器是否支持内部函数“SIZEOF”。根据结果​​,makefile 条件设置为在构建 H5test_kind 时切换要使用的源文件(在本例中为 H5test_kind_SIZEOF.f90 或 H5test_kind.f90)。还有许多 C++ 编译器检查。其他 AC_TRY_RUN 检查包括:检查是否支持大文件,检查 SZIP 压缩是否可以编码,检查 gettimeofday 是否使用时区结构,以及检查转换能力的更多内容。

第二个(破坏性的?)问题是 H5Tinit.c 的生成,在较小程度上,H5libsettings.c 实际上是在“make”中生成的,而不是通过配置生成的。生成它们的程序是编译为在目标平台上运行的 C 程序,但是它们随后在构建平台上的“make”期间运行,因此会失败(或者在某些情况下,只会产生不正确的结果)。HDF5 需要在配置期间生成这些源文件,而无需在构建系统上执行与机器相关的程序。(换句话说,对于 H5Tinit.c,HDF5 需要做 H5detect 所做的事情,但是使用可以在构建平台上配置期间运行的脚本语言。由于 h5detect 应该检测目标上的机器字节顺序和浮点格式平台,

解决此问题的旧方法

我已经发布了相当长的说明,介绍如何解决问题,将其编译为名为Android HDF5 Compilation How-to的要点。

我已经针对 v1.8.18 测试了这个公式,它仍然有效。这是我编写的脚本,作为驱动 .和. 的编译armeabi的起点。armeabi-v7ax86

但是在测试中,一些库函数似乎存在导致崩溃的问题,所以正如我最初所说,如果你不能让编译干净地工作,你可能应该避免使用 HDF5。

于 2017-02-02T10:57:36.500 回答
1

嗯,好久不见,没人回答。目前,我正在做一个在 Android 上支持 hdf5 格式的项目。原来我遇到了一个问题。

兼容性:当前的 hdf5 库是用本机代码编写的。仅当您使用 android 工具链进行交叉编译时才有效。注意:JHDF5 是一个很好的 hdf5 Java 库。但是兼容问题仍然存在。

于 2014-01-23T20:05:05.013 回答
0

另一个解决方案可能是jHDF,它是一个纯 Java HDF5 库,因此不存在 c/c++ 编译问题。只需将依赖项添加到您的 Android 项目中,它应该可以工作。

该库处于早期阶段,因此如果您有问题,请打开一个问题。

免责声明:我是 jHDF 的作者,所以可能有偏见。

于 2019-05-07T20:13:11.987 回答