Android NDKって?
Androidアプリでネイティブコードを利用する際に使用するAndroid NDKについて、
http://developer.android.com/sdk/ndk/index.html
の内容を意訳してみました↓
Android NDKはAndroid アプリでネイティブコードで作られたコンポーネントを組み込むためのツールセットです。AndroidはDalvikVM上で動作します。NDKは、アプリをCやC++で記載されたネイティブコードで実装することができます。このため、既存のライブラリを再利用することができ、開発効率の向上にも貢献します。
NDKが提供するものは
- CやC++で記述されたソースコードから、ネイティブコードライブラリを生成するためのビルドファイルとツールセット。
- Androidデバイスにデプロイ可能なAPKファイルに固有のライブラリを埋め込む方法。
- Android1.5以降の全てのプラットフォームでサポートされるネイティブのシステムヘッダとライブラリセット。
- ドキュメント、サンプル、チュートリアル。
現状バージョンのNDKでサポートしているのは、ARMアーキテクチャで
- ARMv5TE (including Thumb-1 instructions)
- ARMv7-A (including Thumb-2 and VFPv3-D16 instructions, with optional support for NEON/VFPv3-D32 instructions)
今後のリリースで
- x86 instructions (see CPU-ARCH-ABIS.TXT for more information)
がサポートされます。
ARMv5TEのマシンコードであれば、ARMベースのAndroidデバイス全般で動作するでしょう。ARMv7-Aの場合は、Verizon DroidやGoogle Nexus Oneなどの互換CPUをもつデバイスで動作するでしょう。
ARMv5TEと ARMv7-Aの大きな違いは、ARMv7-AがハードウェアFPU(浮動小数点処理装置)、Thumb-2(ARMの拡張命令セット)、およびNEON(メディアおよびデジタル信号の処理に向いた64ビットと128ビットの命令セット)をサポートします。
ARMv5TEと ARMv7-Aの両方でもどちらかでも利用することができ、ARMv5TEをデフォルトとして、ARMv7-Aに切り替えるのは簡単で、Application.mkファイルに1行追加するだけです。
また、ARMv5TEと ARMv7-Aの両方のアーキテクチャ用にビルドすることができ、apkファイルに全て格納できます。詳細については、NDKパッケージのドキュメントに含まれるCPU-ARCH-ABIS.TXTを参照。
NDKは、libc(Cライブラリ)、libm(Mathライブラリ)、OpenGL ES(3Dグラフィックスライブラリ)、JNIインタフェース、および他のライブラリ用に安定したヘッダを提供します。
NDKはほとんどのアプリケーションには効果が無いでしょう。開発者としては、利益と欠点のバランスを取る必要があるでしょう。ネイティブコードを使用することは、著しい自動的なパフォーマンス向上がもたらされることは無く、アプリケーションは複雑化します。
NDKの効果的な使用例としては、多くのメモリを割り当てずにCPU負荷の高い操作 する場合や信号処理、物理学のシミュレーションなどです。単純に既存のメソッドをCで最コーディングしただけでは、大きなパフォーマンス改善には至りません。しかし、既存のC/C++コードを再利用する分には、効果的な方法と言えます。
NDKはネイティブコードだけのアプリケーションを開発するためのものではありません。AndroidのプライマリランタイムはDalvikVMのままです。


