ネイティブ API

このページでは、NDK に含まれるライブラリの概要について説明し、関連する NDK API リファレンスとガイド(存在する場合)へのリンクを掲載しています。

ネイティブ API を使用する

NDK が提供するライブラリを使用するには、次の 2 つのステップを行います。

  1. ライブラリにリンクするよう、ビルドシステムに通知します。

    • ndk-build を使用している場合: Android.mkLOCAL_LDLIBS にライブラリを追加します。 先頭の lib を削除して、代わりに -l と記述することに注意してください。 たとえば、libfoolibbar にリンクするには、makefile LOCAL_LDLIBS := -lfoo -lbar と記述します。

      LOCAL_LDLIBS について詳しくは、Android.mk のドキュメントをご覧ください。

    • CMake を使用している場合: Studio の NDK API を追加するのドキュメントに記載されている手順を実施します。

  2. コードから適切なヘッダーを #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_bufferANDROID_create_native_client_bufferANDROID_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

ガイド: Vulkan グラフィック API ガイド

ビットマップ

libjnigraphics ライブラリは、Java Bitmap オブジェクトのピクセル バッファにアクセスできるようにする API を公開します。ワークフローは次のとおりです。

  1. AndroidBitmap_getInfo() を呼び出して、指定されたビットマップ ハンドルに関する幅と高さなどの情報を取得します。

  2. AndroidBitmap_lockPixels() を呼び出して、ピクセル バッファをロックし、ピクセル バッファへのポインタを取得します。これにより、アプリが AndroidBitmap_unlockPixels() を呼び出すまでピクセルが移動しなくなります。

  3. ピクセル形式、幅、およびその他の特性に適合するようにピクセル バッファを変更します。

  4. 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 では、MediaExtractorMediaCodec、およびその他の関連 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 には次のものが含まれています。

ライブラリ: 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 リファレンス