このページでは、NDK に含まれるライブラリの概要について説明し、関連する NDK API リファレンスとガイド(存在する場合)へのリンクを掲載しています。
ネイティブ API を使用する
NDK が提供するライブラリを使用するには、次の 2 つのステップを行います。
ライブラリにリンクするよう、ビルドシステムに通知します。
ndk-build を使用している場合: Android.mk の
LOCAL_LDLIBS
にライブラリを追加します。 先頭のlib
を削除して、代わりに-l
と記述することに注意してください。 たとえば、libfoo
とlibbar
にリンクするには、makefile LOCAL_LDLIBS := -lfoo -lbar
と記述します。LOCAL_LDLIBS
について詳しくは、Android.mk のドキュメントをご覧ください。CMake を使用している場合: Studio の NDK API を追加するのドキュメントに記載されている手順を実施します。
コードから適切なヘッダーを
#include
します。
アプリの minSdkVersion
より新しい API は、デフォルトでは呼び出しできないため、代わりに dlopen()
と dlsym()
を介して使用する必要があります。簡単な方法については、新しい API の使用をご覧ください。
コア C / C++
C ライブラリ
<stdlib.h>
や <stdio.h>
など、標準 C11 ライブラリ ヘッダーを通常どおり利用できます。
Android では、Linux とは異なり、libpthread
および librt
ライブラリは独立していません。その機能は libc
に直接含まれており、明示的にリンクする必要はありません。
数学関数用には(通常の UNIX の慣習に従って)別個の libm
がありますが、libc
と同様に、ビルドシステムによって自動的にリンクされます。
dlopen(3) や dlsym(3) といった <dlfcn.h>
のダイナミック リンカー機能を利用できますが、明示的に libdl
にリンクする必要があります。
ライブラリ: libc
/ libm
/ libdl
C++ ライブラリ
C++17 のサポートが利用できます。C++ ライブラリのサポートに関する詳細は、C++ ライブラリ サポートをご覧ください。
ログ
<android/log.h>
には、logcat にロギングするための API が含まれています。
API レベル 3 以降で使用できます。
ライブラリ: liblog
リファレンス: Logging
トレース
ネイティブ トレース API(<android/trace.h>
)は、Java プログラミング言語の android.os.Trace
クラスに相当するネイティブの機能を提供します。この API を使用すると、トレース イベントをシステム トレース バッファに書き込んで、コード内で名前が付いている作業単位をトレースできます。その後、Systrace ツールを使用してトレース イベントを収集および分析できます。
API レベル 23 以降で使用できます。
ライブラリ: libandroid
ガイド: ネイティブ トレース
zlib 圧縮
<zlib.h>
をインクルードして libz
にリンクすることで、Zlib 圧縮ライブラリを使用できます。
NDK には、リリース時の最新の zlib ヘッダー ファイルが常に含まれています。NDK に含まれる静的リンク用の libz.a
バージョンは常に同じですが、動的リンク用の libz.so
はデバイスから取得され、そのデバイスでリリースされているバージョンになります。つまり、ビルド対象のヘッダーがデバイスの zlib のバージョンと一致しないことになります。実装の詳細について推測しているに過ぎないということを、ここでは改めて注意してください。公開 API に関する問題は生じていませんが、特に構造体レイアウトは時間とともに変化しており、今後も変化していく可能性があります。zlib 以降のバージョンの新しい API は、この API より前の OS バージョンでは使用できないものと考えてください。libz.so
ではなく静的な libz.a
を常に使用することで、こうした問題はすべて回避できますが、その代わりに APK のサイズが増大します。
API レベル 3 以降で使用できます(前述の注記を参照)。
ライブラリ: libz
グラフィック
OpenGL ES 1.0~3.2
標準の OpenGL ES 1.x ヘッダー(<GLES/gl.h>
および <GLES/glext.h>
)、2.0 ヘッダー(<GLES2/gl2.h>
および <GLES2/gl2ext.h>
)、3.0 ヘッダー(<GLES3/gl3.h>
および <GLES3/gl3ext.h>
)、3.1 ヘッダー(<GLES3/gl31.h>
および <GLES3/gl3ext.h>
)、3.2 ヘッダー(<GLES3/gl32.h>
および <GLES3/gl3ext.h>
)には、OpenGL ES に必要な宣言が含まれています。
OpenGL ES 1.x を使用するには、ネイティブ モジュールを libGLESv1_CM
にリンクする必要があります。
OpenGL ES 2.0 を使用するには、ネイティブ モジュールを libGLESv2
にリンクする必要があります。
OpenGL ES 3.x を使用するには、ネイティブ モジュールを libGLESv3
にリンクする必要があります。
Android ベースのデバイスはすべて OpenGL ES 1.0 と 2.0 をサポートしています。
それ以降のバージョンの OpenGL ES に対する完全なサポートは、必要な GPU を備えた Android デバイスでのみ提供されます。ただし、ライブラリは、該当するバージョンの OpenGL ES が導入された API レベルをサポートするすべてのデバイスに含まれています。そうしたライブラリにリンクしても問題はありませんが、アプリで OpenGL ES のバージョン文字列および拡張子の文字列に対してクエリを実行して、現在のデバイスが必要な機能をサポートしているかどうかを判定する必要があります。このクエリの実行方法については、OpenGL 仕様の glGetString()
をご覧ください。
さらに、マニフェスト ファイルで <uses-feature>
タグを使用して、必要な OpenGL ES のバージョンを指定する必要があります。
OpenGL ES 1.0 は、API レベル 4 以降で使用できます。
OpenGL ES 2.0 は、API レベル 5 以降で使用できます。
OpenGL ES 3.0 は、API レベル 18 以降で使用できます。
OpenGL ES 3.1 は、API レベル 21 以降で使用できます。
OpenGL ES 3.2 は、API レベル 24 以降で使用できます。
EGL
EGL では、OpenGL ES のコンテキストとサーフェスを割り当てて管理するためのネイティブ プラットフォーム インターフェースが、<EGL/egl.h>
および <EGL/eglext.h>
ヘッダーを通じて提供されています。
EGL を使用すると、ネイティブ コードから次の操作を実行できます。
- サポートされる EGL 設定をリストする。
- OpenGL ES サーフェスの割り当てと解放を実行する。
- OpenGL ES コンテキストの作成と破棄を実行する。
- サーフェスをスワップまたはフリップする。
API レベル 24 において、EGL_KHR_mutable_render_buffer
、ANDROID_create_native_client_buffer
、ANDROID_front_buffer_auto_refresh
の各拡張機能のサポートが追加されました。
API レベル 9 以降で使用できます。
ライブラリ: libEGL
ガイド: EGL Native Platform Interface
Vulkan
Vulkan は、高パフォーマンスの 3D グラフィック レンダリングを実現する、低オーバーヘッドのクロス プラットフォーム API です。Vulkan は、Khronos Group が管理しているオープン スタンダードです。標準の <vulkan/vulkan.h>
ヘッダー ファイルには、コードから Vulkan レンダリング呼び出しを実行するために必要な宣言が含まれています。
コードサンプルについては、GitHub の LunarG VulkanSamples プロジェクトと android-vulkan-tutorials プロジェクトをご覧ください。
Vulkan ライブラリは API レベル 24 以降をサポートするすべてのデバイスに含まれていますが、実行時にアプリで必要な GPU ハードウェア サポートが利用できることを確認する必要があります。Vulkan をサポートしていないデバイスは、vkEnumeratePhysicalDevices
から 0 個のデバイスを返します。
API レベル 24 以降で使用できます。
ライブラリ: libvulkan
ビットマップ
libjnigraphics
ライブラリは、Java Bitmap
オブジェクトのピクセル バッファにアクセスできるようにする API を公開します。ワークフローは次のとおりです。
AndroidBitmap_getInfo()
を呼び出して、指定されたビットマップ ハンドルに関する幅と高さなどの情報を取得します。AndroidBitmap_lockPixels()
を呼び出して、ピクセル バッファをロックし、ピクセル バッファへのポインタを取得します。これにより、アプリがAndroidBitmap_unlockPixels()
を呼び出すまでピクセルが移動しなくなります。ピクセル形式、幅、およびその他の特性に適合するようにピクセル バッファを変更します。
AndroidBitmap_unlockPixels()
を呼び出して、バッファのロックを解除します。
API レベル 8 以降で使用できます。
ライブラリ: libjnigraphics
リファレンス: Bitmap API リファレンス
Sync API
API レベル 26 以降で使用できます。
ライブラリ: libsync
リファレンス: Sync API リファレンス
カメラ
ネイティブ カメラ API は、きめ細かい写真のキャプチャと処理を実行します。 Java Camera2 API とは異なり、ネイティブ カメラ API では非推奨のカメラの HAL 1.0 実装をサポートしていません(つまり、ネイティブ カメラ API で使用可能なカメラのリストには、LEGACY ハードウェア レベルのカメラデバイスは含まれません)。
API レベル 24 以降で使用できます。
ライブラリ: libcamera2ndk
リファレンス: Camera API リファレンス
Media
libmediandk
メディア API では、MediaExtractor
、MediaCodec
、およびその他の関連 Java API に類似した、低レベルのネイティブ インターフェースを提供します。
ライブラリ: libmediandk
リファレンス: Media API リファレンス
OpenMAX AL
Android ネイティブ マルチメディアの処理は、Khronos Group の OpenMAX AL 1.0.1 API に基づいています。
標準の OpenMAX AL ヘッダー <OMXAL/OpenMAXAL.h>
および <OMXAL/OpenMAXAL_Platform.h>
には、Android のネイティブ サイドからマルチメディア出力を実行するために必要な宣言が含まれています。
また、OpenMAX AL の NDK の配布により、Android 固有の拡張機能が提供されます。
こうした拡張機能の詳細については、<OMXAL/OpenMAXAL_Android.h>
のコメントをご覧ください。
API レベル 14 以降で使用できます。
ライブラリ: libOpenMAXAL
Android のネイティブ アプリ API
詳細については、Android NDK API リファレンスのドキュメントをご覧ください。
API には次のものが含まれています。
- Asset
- Choreographer
- Configuration
- Input
- Looper
- Native Activity
- Native Hardware Buffers
- Native Window
- Memory
- Networking
- Sensor
- Storage
- SurfaceTexture
ライブラリ: libandroid
ライブラリ: libnativewindow
(新しいネイティブ ウィンドウ機能用)
完全なリファレンス: Android NDK API リファレンス
ハードウェア バッファ API
プロセス間バッファ管理用の独自のパイプラインの作成を可能にする 2 つのネイティブ API が用意されています。
ネイティブ ハードウェア バッファ API(<android/hardware_buffer.h>
)を使用すると、バッファを直接割り当てて、プロセス間バッファ管理用の独自のパイプラインを作成できます。
AHardwareBuffer
を割り当て、それを使用することで eglGetNativeClientBufferANDROID
拡張機能を介して EGLClientBuffer
リソースタイプを取得できます。そのバッファを eglCreateImageKHR
に渡し、サポートされているデバイス上で glEGLImageTargetTexture2DOES
を介してテクスチャにバインドできる EGLImage
リソースタイプを作成できます。これは、プロセス間で共有するテクスチャを作成するのに役立ちます。
ネイティブ ハードウェア バッファ JNI API(<android/hardware_buffer_jni.h>
)を使用すると、HardwareBuffer
オブジェクトを取得できます。これは Parcelable であるため、2 つの異なるプロセス間で転送できます。これにより、内部の Android API にアクセスすることなく、プロセス間に独自のバッファのキューを作成するなどの SurfaceFlinger と同様の機能をアプリで使用できるようになります。
音声
AAudio
AAudio は、現在サポートされているネイティブ オーディオ API です。この API は OpenSL ES を置き換えるもので、低遅延オーディオを必要とする高性能オーディオ アプリに対するサポートが強化されています。
API レベル 26 以降で使用できます。
ライブラリ: libaaudio
ガイド: AAudio API ガイド
リファレンス: AAudio API リファレンス
OpenSL ES
OpenSL ES はサポートされているもう一つのネイティブ オーディオ API ですが、下記のガイドの注意事項をご覧ください。
API レベル 9 以降で使用できます。API レベル 14 で PCM のサポートが追加されました。
ライブラリ: libOpenSLES
ガイド: OpenSL ES for Android ガイド
Neural Networks API
Neural Networks API(NNAPI)によって、デバイス上で機械学習処理を行うためのハードウェア アクセラレーションがアプリに提供されます。この API は、デバイス上でのモデル作成、コンパイル、および実行をサポートしています。Neural Networks API は通常、アプリによって直接使用されることはありません。代わりに、機械学習のライブラリ、フレームワーク、ツール(デベロッパーがモデルをトレーニングしたり、そのモデルを Android デバイスにデプロイしたりするのに使用するツール)から呼び出されることを想定して設計されています。
API レベル 27 以降で使用できます。
ライブラリ: libneuralnetworks
ガイド: Neural Networks ガイド
リファレンス: Neural Networks API リファレンス