プロジェクトへの C / C++ コードの追加

C / C++ コードを Android プロジェクトに追加するには、プロジェクト モジュールの cpp ディレクトリにコードを配置します。プロジェクトをビルドすると、このコードがネイティブ ライブラリにコンパイルされ、Gradle で APK にパッケージ化できるようになります。Java または Kotlin コードでは JNI(Java Native Interface)を介してネイティブ ライブラリの関数を呼び出すことができます。JNI フレームワークの使用方法について詳しくは、Android での JNI の使い方をご覧ください。

Android Studio は、クロス プラットフォーム プロジェクトに適した CMake と、ndk-build をサポートしています。ndk-build は CMake より高速ですが、サポート対象は Android のみです。現時点では、CMake と ndk-build の両方を同じモジュール内で使用することはできません。

既存の ndk-build ライブラリを Android Studio プロジェクトにインポートする場合は、Gradle をネイティブ ライブラリ プロジェクトにリンクさせる方法をご覧ください。

このページでは、必要なビルドツールを搭載した Android Studio のセットアップ方法、C / C++ のサポートを使用して新しいプロジェクトを作成する方法、プロジェクトに新しい C / C++ ファイルを追加する方法を説明します。

既存のプロジェクトにネイティブ コードを追加する場合は、次の手順を行う必要があります。

  1. 新しいネイティブ ソースファイルを作成して、Android Studio プロジェクトに追加します。
    • すでにネイティブ コードがある場合や、ビルド済みネイティブ ライブラリをインポートする場合は、この手順をスキップしてください。
  2. ネイティブ ソースコードをライブラリにビルドするように CMake を設定します。このビルド スクリプトは、ビルド済みライブラリやプラットフォーム ライブラリに対してインポートやリンクを行う際にも必要になります。
    • CMakeLists.txt ビルド スクリプトが存在する既存のネイティブ ライブラリを使用する場合や、ndk-build を使用して Android.mk ビルド スクリプトを組み込む場合は、この手順をスキップしてください。
  3. CMake または ndk-build スクリプト ファイルへのパスを指定して、Gradle を設定します。Gradle はこのビルド スクリプトを使用してソースコードを Android Studio プロジェクトにインポートし、ネイティブ ライブラリ(SO ファイル)を APK にパッケージ化します。

プロジェクトを設定すると、JNI フレームワークを使用して Java または Kotlin コードからネイティブ関数にアクセスできるようになります。Run アイコン メニューバーの [Run] をクリックしてアプリを実行 をクリックするだけで、アプリをビルドして実行できます。

注: サポートが終了した ndkCompile ツールを既存のプロジェクトで使用している場合は、CMake または ndk-build を使用するように移行する必要があります。詳しくは、ndkCompile から移行する方法をご覧ください。

試験運用版の Gradle ユーザーの皆様へ: ネイティブ プロジェクトですでに CMake または ndk-build を使用している、Gradle ビルドシステムの安定版を使用したい、アドオンツール(CCache など)のサポートを必要としている、のいずれかに当てはまる場合は、プラグイン バージョン 2.2.0 以降に移行し、CMake または ndk-build を使用してネイティブ ライブラリをビルドすることをご検討ください。これらの条件に当てはまらない場合は、引き続き試験運用版の Gradle と Android プラグインを使用できます。

NDK とビルドツールのダウンロード

アプリ用のネイティブ コードをコンパイル、デバッグするには、次のコンポーネントが必要です。

  • Android NDK(Native Development Kit): Android で C / C++ コードを使用するためのツールセット。NDK のプラットフォーム ライブラリを使用することで、ネイティブ アクティビティを管理し、センサーやタップ入力などの実機のコンポーネントにアクセスできるようになります。
  • CMake: Gradle と連携してネイティブ ライブラリをビルドする外部ビルドツール。ndk-build のみを使用する予定の場合は、このコンポーネントは不要です。
  • LLDB: Android Studio がネイティブ コードをデバッグする際に使用するデバッガ。

各コンポーネントは、SDK Manager を使用してインストールできます。

  1. 開いているプロジェクトで、メニューバーの [Tools] > [SDK Manager] を選択します。
  2. [SDK Tools] タブをクリックします。
  3. 図 1 に示すように、[LLDB]、[CMake]、[NDK] の横にあるチェックボックスをオンにします。

    図 1. SDK Manager で LLDB、CMake、NDK をインストールします。

  4. [Apply] をクリックし、ポップアップ ダイアログで [OK] をクリックします。
  5. インストールが完了したら、[Finish] をクリックして、[OK] をクリックします。

CMake 3.6.0 または 3.10.2 を使用する

SDK Manager には、CMake の 3.6.0 分岐バージョンとバージョン 3.10.2 が含まれています。build.gradle で特定のバージョンの CMake を設定していないプロジェクトは、CMake 3.6.0 を使用してビルドされます。より最近のバージョンを使用するには、モジュールの build.gradle ファイルで CMake バージョン 3.10.2 を指定します。

    android {
        ...
        externalNativeBuild {
            cmake {
                ...
                version "3.10.2"
            }
        }
    }
    
おすすめの方法ではありませんが、3.10+3+ のように build.gradle のエントリの末尾に + を付加することで、CMake のバージョンを最小バージョンとして指定できます。

カスタムの CMake バージョンを使用する

SDK Manager に含まれていない CMake バージョン 3.7 以降を使用する場合は、次の手順を行います。

  1. CMake の公式ウェブサイトから CMake 3.7 以降をダウンロードしてインストールします。
  2. Gradle で使用する CMake バージョンをモジュールの build.gradle ファイルで指定します。
        android {
            ...
            externalNativeBuild {
                cmake {
                    ...
                    version "cmake-version"
                }
            }
        }
        
  3. CMake のインストール パスを PATH 環境変数に追加するか、以下に示すようにプロジェクトの local.properties ファイルに含めます。build.gradle ファイルで指定した CMake のバージョンを Gradle が見つけられない場合は、ビルドエラーになります。
        # If you set this property, Gradle no longer uses PATH to find CMake.
        cmake.dir="path-to-cmake"
        
  4. Ninja ビルドシステムをワークステーションにまだインストールしていない場合は、Ninja の公式ウェブサイトにアクセスして、ご利用の OS に対応している最新版の Ninja をダウンロードしてインストールしてください。また、Ninja のインストール パスを PATH 環境変数に追加してください。

C / C++ のサポートを使用した新しいプロジェクトの作成

ネイティブ コードのサポートを使用した新しいプロジェクトの作成は、他の Android Studio プロジェクトの作成に似ていますが、次の追加の手順を行う必要があります。

  1. ウィザードの [Choose your project] で、プロジェクト タイプとして [Native C++] を選択します。
  2. [Next] をクリックします。
  3. ウィザードの次のセクションで、他のすべてのフィールドに入力します。
  4. [Next] をクリックします。
  5. ウィザードの [Customize C++ Support] の [C++ Standard] でプロジェクトをカスタマイズできます。プルダウン リストでは、使用する C++ の標準化を選択します。[Toolchain Default] を選択すると、CMake のデフォルト設定が使用されます。
  6. [Finish] をクリックします。

Android Studio で新しいプロジェクトの作成が完了したら、IDE の左側の [Project] ペインを開き、[Android] ビューを選択します。図 2 に示すように、Android Studio に cpp グループが追加されます。

図 2. Android ビューのネイティブ ソースのグループと外部ビルド スクリプトのグループ

注: このビューではディスク上の実際のファイル階層は反映されておらず、プロジェクト内を移動しやすいように類似のファイルがグループ化されています。

cpp グループには、プロジェクトに含まれているすべてのネイティブ ソースファイル、ヘッダー、CMake または ndk-build のビルド スクリプト、ビルド済みのライブラリがあります。新しいプロジェクトでは、Android Studio によってサンプルの C++ ソースファイルである native-lib.cpp が作成され、アプリ モジュールの src/main/cpp/ ディレクトリに配置されます。このサンプル コードには、「Hello from C++」という文字列を返す簡単な C++ 関数 stringFromJNI() が記述されています。プロジェクトにソースファイルを追加する方法については、新しいネイティブ ソースファイルの作成方法についてのセクションをご覧ください。

build.gradle ファイルで Gradle にアプリのビルド方法を指示するのと同様に、CMake と ndk-build はビルド スクリプトでネイティブ ライブラリのビルド方法を確認する必要があります。新しいプロジェクトでは、Android Studio によって CMake ビルド スクリプトである CMakeLists.txt が作成され、モジュールのルート ディレクトリに配置されます。このビルド スクリプトの内容について詳しくは、CMake の設定をご覧ください。

サンプルアプリをビルドして実行する

Run アイコン メニューバーの [Run] をクリックしてアプリを実行 をクリックすると、Android デバイスまたはエミュレータにテキスト「Hello from C++」を表示するアプリが Android Studio によってビルドおよび起動されます。ここでは、サンプルアプリをビルドおよび実行する際に発生するイベントの概要を説明します。

  1. Gradle が外部ビルド スクリプトの CMakeLists.txt を呼び出します。
  2. CMake がビルド スクリプトのコマンドに従って C++ ソースファイルの native-lib.cpp をコンパイルして共有オブジェクト ライブラリを生成し、libnative-lib.so という名前を付けます。次に、Gradle がこのライブラリを APK にパッケージ化します。
  3. 実行時にアプリの MainActivitySystem.loadLibrary() を使用してネイティブ ライブラリを読み込みます。これで、ライブラリのネイティブ関数である stringFromJNI() をアプリで使用できるようになりました。
  4. MainActivity.onCreate()stringFromJNI() を呼び出し、返された「Hello from C++」で TextView を更新します。

注: Instant Run は、ネイティブ コードで記述されたプロジェクトのコンポーネントと互換性がありません。

Gradle がネイティブ ライブラリを APK にパッケージ化したことを確認するには、APK Analyzer を使用します。

  1. [Build] > [Build Bundles(s) / APK(s)] > [Build APK(s)] を選択します。
  2. [Build] > [Analyze APK] を選択します。
  3. app/build/outputs/apk/ ディレクトリで APK を選択し、[OK] をクリックします。
  4. 図 3 に示すように、[APK Analyzer] ウィンドウの lib/<ABI>/ の下に libnative-lib.so が表示されます。

    図 3. APK Analyzer を使用してネイティブ ライブラリを特定します。

ヒント: ネイティブ コードを使用する他の Android アプリで試す場合は、[File] > [New] > [Import Sample] をクリックし、[Ndk] リストからサンプル プロジェクトを選択します。

新しい C / C++ ソースファイルの作成

既存のプロジェクトに新しい C / C++ ソースファイルを追加するには、次の手順を行います。

  1. アプリのメイン ソースセットに cpp/ ディレクトリをまだ作成していない場合は、次の手順で作成します。
    1. IDE の左側にある [Project] ペインを開き、プルダウン メニューの [Project] ビューを選択します。
    2. your-module > src に移動し、main ディレクトリを右クリックして [New] > [Directory] を選択します。
    3. ディレクトリ名として「cpp」と入力し、[OK] をクリックします。

  2. cpp/ ディレクトリを右クリックし、[New] > [C/C++ Source File] を選択します。
  3. ソースファイルの名前(native-lib など)を入力します。
  4. [Type] プルダウン メニューで、ソースファイルのファイル拡張子(.cpp など)を選択します。
    • その他のファイル形式(.cxx.hxx など)をプルダウン メニューに追加することもできます。その場合、Edit File Types アイコン をクリックします。ポップアップ表示された [C/C++] ダイアログ ボックスの [Source Extension] プルダウン メニューと [Header Extension] プルダウン メニューで別のファイル拡張子を選択し、[OK] をクリックします。
  5. ヘッダー ファイルを作成する場合は、[Create an associated header] チェックボックスをオンにします。
  6. [OK] をクリックします。

新しい C / C++ ファイルをプロジェクトに追加した後、CMake の設定でそれらのファイルをネイティブ ライブラリに含める必要があります。

参考情報

アプリでの C / C++ コードのサポートについて詳しくは、以下のリソースをご覧ください。

コードラボ

  • Android Studio での Hello-CMake の作成コードラボでは、Android Studio の CMake テンプレートを使用して Android NDK プロジェクトの開発を始める方法が紹介されています。