web-dev-qa-db-ja.com

NDKを使用して複数のアーキテクチャをターゲットにする方法は?

バックグラウンド

私は最近、NDKを使用していくつかのコードの開発を開始し、NDKを使用して開発中に発生する可能性のある移植性の問題について考えました。

問題

NDKはネイティブコードを使用するため、CPUアーキテクチャごとにコンパイルする必要があります。ユーザーがデバイスのCPUに関係なくアプリを実行する必要があるため、これは問題です。

これまでに見つけた可能な解決策

「jni/Application.mk」ファイルを変更して使用できることに気づきました。

APP_ABI:= armeabi armeabi-v7a x86

しかし、私はこのステップから何をすべきか分かりません。アプリには、各CPUアーキテクチャのコンパイル済みコードがすべて含まれ、それ自体を実行するときに正しいコードが自動的に選択されますか?

また、不明な別のCPUアーキテクチャがある場合はどうなりますか?

Google TVでアプリを実行しようとするとどうなりますか。覚えている限りでは、NDKをまったくサポートしていません。

私が見つけた別の解決策は、マルチAPKサポートです。しかし、私はそれを理解しているかどうかはわかりません。それはすべて、毎回異なる設定で同じAPKを作成するということですか?それを支援するADTの特別な自動化ツールはありませんか?

27

APP_ABIをまったく設定しない場合、または使用する場合

APP_ABI := all

Application.mkで、ndk-buildはすべてのビルドを行いますNDKのバージョンでサポートされているアーキテクチャ。最新のr8dは、mips用のarmeabi armeabi-v7a x86ビルドに加えて、ビルドされます。別のアーキテクチャがリリースされると、それをサポートするAPKが自動的にビルドされます。

アプリケーションがAndroidデバイスにインストールされると、システムは自動的に一致するABIバージョンを選択し、APKから正しい共有ライブラリをインストールします。

このアプローチの1つの欠点は、ネイティブライブラリが大きい場合、「モノリシック」APKファイルが巨大になる可能性があることです。マルチAPKアプローチを使用して、ユーザーダウンロードを小さくすることができます。 公式サイト 推奨: APKが大きすぎる(50MBを超える)場合のみ、通常、複数のAPKを使用して異なるデバイス構成をサポートする必要があります。このルートを選択する場合は、バージョンコードのガイドラインに注意深く従ってください。

残念ながら、Google TVでのNDKサポートに関する信頼できる予言はありませんが、現在利用できないことを技術的に正当化することはできないようです。到着すると、ndk-buildが自動的に処理します。

[〜#〜] update [〜#〜]ここ は、分割APKを維持するための簡単なプロセスです。ところで、新しいAndroid TVはNDKをサポートしています。

30
Alex Cohn

最新バージョン(現在はr9)の場合は、「jni/Application.mk」で指定する必要があります

APP_ABI := all

または

APP_ABI := armeabi armeabi-v7a x86 mips

./ndk_buildなしでは、「armeabi」のみがビルドされます

5
hannes ach