Android Native Development Kit

概要 
Androidのアプリケーション開発には通例Java仮想マシン（Dalvik仮想マシン/Android Runtime）上で動作するJavaあるいはKotlinといったJVMマネージ言語を利用する。マネージ言語はメモリ管理や生産性、移植性の点で優れているが、メモリへの直接アクセスによるパフォーマンス向上や、x86のSSEあるいはARMのNEONといったプロセッサ (CPU) アーキテクチャ固有の拡張命令の使用、またOpenCVのような既存のC/C++コード資産を活用する目的で、NDKを用いたマシンネイティブな開発が許可されている。ただしNDKを利用すると、CPUアーキテクチャごとにバイナリを用意しなければならなくなるというデメリットもある。

Android 2.3以降ではNativeActivityのサポートにより、制約はあるもののC/C++のみでアプリケーション開発をすることもできるようになっている。JVMとネイティブコード間の相互運用には、一般的なデスクトップのJavaアプリケーション開発時と同様、Java Native Interface (JNI) を利用できる。Androidのグラフィカルユーザーインターフェイス (GUI) ライブラリ（ウィジェット・ツールキット）など、上位レベルのAPIはAndroid SDKに含まれるが、大半はJVM言語向けにしか提供されておらず、C/C++向けには提供されていないため、C/C++から利用するにはJNIを経由する必要がある。

NDKにおけるAndroid固有のネイティブAPIAndroid NDK ネイティブ API  |  Android Developersは、"A" で始まる名前が付けられており、JVM言語用APIとよく似たものも提供されている。

新しいバージョンのAndroid OSで追加された機能をNDK経由で利用する場合、Android SDK経由でJVM言語用APIを使うときと同様に、minSdkVersionを設定しておくことで、利用可能なAPIセット（関数の集合）がコンパイル時に静的に決定されるAndroid SDK バージョンのプロパティ  |  Android NDK  |  Android Developers。一方、実行環境に応じてminSdkVersionよりも新しいAPIを使用したい場合は、dlopen()とdlsym()を使って関数エントリポイントを動的ロードする（リフレクションに相当）か、弱いAPI参照を使う方法がある新しい API の使用  |  Android NDK  |  Android Developers。

最新のNDKでは、ある程度古いバージョンのAndroid OSはサポートが打ち切られている。r18ではIce Cream Sandwich (Android 4.0; API 14, 15) のサポートが打ち切られた。r24ではJelly Bean (Android 4.1-4.3; API 16-18) のサポートが打ち切られた。r26ではKitKat (Android 4.4; API 19-20) のサポートが打ち切られた。

 脚注 

 関連項目 
 機械語 (ネイティブコード)
 マネージコード
 Java Native Interface
 Android (オペレーティングシステム)#開発環境
 Android Studio
 Android Development Tools
 Androidのバージョン履歴

 外部リンク 
 googlesamples/android-ndk: Android NDK samples with Android Studio - NDKを利用したサンプル
 native - platform/frameworks/base - Git at Google - Android NDK固有APIのソースコード

Category:プログラミング
Category:ライブラリ (プログラミング)
Category:ソフトウェア開発キット