2017-10-18 14 views
0

いくつかのアンドロイドアプリでJNIコードから呼び出されているライブラリ(.so)をビルドしました。 JNIコードはNDKを使用して構築されています。アンドロイドアプリのコンテキストで動作するc/C++コードをコンパイルするためにアンドロイドツールチェーン(またはNDK)を使用する必要があるのはなぜですか?

アンドロイドツールチェーンを使用してライブラリを構築すると、ライブラリはJNIコードから呼び出されたときにうまく機能します。

他のツールチェーン(none androidアプリケーションでは同じARMデバイスで使用)を使用してライブラリを構築すると、JNIコードから呼び出されるとライブラリがクラッシュします。

アンドロイドアプリのコンテキストで実行されているc/C++コードをコンパイルするためにアンドロイドツールチェーン(またはNDK)を使用する必要があるのはなぜですか?なぜ他のツールチェーンを使用しないのですか?

+0

他のどのツールチェーンを使用していますか? – MuertoExcobito

+0

他のツールチェーンは、ARMv7用のクロスツールを使用して構築され、デバイス上の非アンドロイドアプリに使用されます。 – sami

+0

なぜこれをやりたいですか?これを行うには多くの作業が必要ですが、最終的にはNDKのサブセットを持つだけです。 –

答えて

3

他のツールチェーンを使用することもできますが、特別な注意が必要です。

UBERTCLinaro Wikiを学ぶのがよいかもしれません。

主な違いは、NDKコンパイラは、バイオニック(Androidランタイムライブラリの亜種)に調整されていることです。もともと、バイオニックはLinuxランタイムの中では控えめなサブセットでした。最新のプラットフォームでは、ほとんどのギャップが解消されていますが、今では必要と思われる拡張が多数あります。

また、Androidダイナミックリンカーでは、PIC、IDなどのNDK binutilsによって自動的に配信されるELFフラグのセットが必要になる場合があります(ターゲットプラットフォームによって異なる)。

Androidで実行される静的にリンクされた実行可能ファイルを構築するためにarm-linuxツールチェーンを使用することはかなり可能ですが、JNI環境でうまく動かなければならないライブラリの場合、おそらくその価値はありません。

NDKには、慣れ親しんでいる他のツールチェーンとよく似た、スタンドアロンのツールチェーンを作成するためのツールが用意されています。このアプローチにより、3 rd -partyライブラリを洗練されたビルドスクリプトで簡単に採用することができます。

+0

これらはすべて有効な点ですが、私は彼らが全話を伝えるかどうかはわかりません。 Bionicは、他のほとんどのCライブラリと同じ関数名(関数が存在する場所)を使用しているため、リンカが解決しなければならない問題が発生する可能性があります。最新のAndroidリリースでは、位置独立コード(PIC)が必要ですが、Google NDKツールチェーンでも、それを可能にするためにコマンドライン引数を渡す必要があります。私はあなたに同意していないが、私は他の事柄も同様に起こっていると思う。 –

+0

@KevinBoone確かに、[* NDNツールチェーン以外でAndroid JNIライブラリを構築し、精神病院での終了を回避する方法](https://www.wikihow.com/Build-an-Android-JNI NDK-Toolchain以外のライブラリ)は依然として書かれています。幸いにも、OPは「なぜ?」と尋ねただけです。 –

関連する問題