AndroidでHDF5 ソフトウェアをどのように使用しますか? ネイティブ C++ ライブラリを Android プラットフォーム用にコンパイルし、HDF5 Java バインディングを使用して呼び出すことはできますか?
3 に答える
Android用のクロスコンパイラを使用して(簡単に)コンパイルすることはできません
これを機能させるには、ARM デバイス、特に Android ツールチェーンでコンパイルする必要があります。正直なところ、NDK プロジェクトでは HDF5 を使用しないでください。バイナリを生成できたとしても、サポートされないからです。
先に進み、NDK-CMake-gradle を使用してコンパイルしようとしましたが、さまざまな型のサイズを把握しようとして失敗しました。以前にこの種の動作を見たことがありますが、通常は実行可能ファイルをエミュレータまたはデバイスにアップロードし、実行して結果を読み取る必要があります。クールではありません。
彼ら自身のFAQによると:
いいえ、HDF5 でのクロスコンパイルには 2 つの問題があります。
まず、HDF5 はいくつかの場所で AC_TRY_RUN を使用します。このマクロは、テスト プログラムをコンパイルして実行しようとしますが、ホスト システム用にプログラムをビルドし、ビルド システムで実行しようとするため、クロス コンパイルでは機能しません。これを解決するには、マクロを非動的テスト (つまり、テスト プログラムを実行せずに正しい設定を決定する) に置き換えるか、クロスコンパイル時に何をすべきかを示す引数で各 AC_TRY_RUN を修正する必要があります (これは、クロスコンパイルに悲観的なデフォルトを設定することを意味する可能性があります)。
これらの AC_TRY_RUN インスタンスの多くは、コンパイラ機能のチェック用です。たとえば、HDF5 は、テスト プログラムを実行して、Fortran コンパイラが組み込み関数「SIZEOF」をサポートしているかどうかを確認します。結果に基づいて、H5test_kind をビルドするときに使用するソース ファイルを切り替えるための makefile 条件が設定されます (この場合、H5test_kind_SIZEOF.f90 または H5test_kind.f90)。多くの C++ コンパイラ チェックもあります。その他の AC_TRY_RUN チェックには、大きなファイルがサポートされているかどうかのチェック、SZIP 圧縮がエンコードできるかどうかのチェック、gettimeofday がタイムゾーン構造体を使用しているかどうかのチェックなど、変換機能をチェックするための多くのチェックが含まれます。
2 番目の (ディールブレイク?) 問題は H5Tinit.c の生成であり、H5libsettings.c は構成ではなく「make」内で実際に生成されます。それらを生成するプログラムは、ターゲット プラットフォームで実行するようにコンパイルされた C プログラムですが、ビルド プラットフォームでの「make」中に実行されるため、失敗します (場合によっては、単純に間違った結果を生成します)。HDF5 は、ビルド システムでマシン依存のプログラムを実行せずに、configure 中にこれらのソース ファイルを生成する必要があります。(つまり、H5Tinit.c の場合、HDF5 は H5detect と同じことを行う必要がありますが、ビルド プラットフォームの構成中に実行できるスクリプト言語で行う必要があります。h5detect は、ターゲットでマシンのバイト オーダーと浮動小数点形式を検出することになっているためです。プラットホーム、
この問題を回避するための古いハウツー
Android HDF5 Compilation How-toと呼ばれる要点としてコンパイルする際の問題をハッキングするためのかなり長い手順を投稿しました。
この式を v1.8.18 に対してテストしましたが、まだ機能しています。、および. _ armeabi
_ armeabi-v7a
_x86
ただし、テストでは、一部のライブラリ関数がクラッシュを引き起こす問題があるようです。そのため、最初に述べたように、コンパイルを正常に動作させることができない場合は、おそらく HDF5 を避ける必要があります。