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

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

Android Studio は、クロス プラットフォーム プロジェクトに適した CMake をサポートしています。Android Studio は、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 プロジェクトにインポートし、ネイティブ ライブラリをアプリにパッケージ化します。

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

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

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

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

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

こうしたコンポーネントのインストールについては、NDK と CMake のインストールと設定をご覧ください。

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] ビューを選択します。図 1 に示すように、Android Studio に cpp グループが追加されます。

図 1. 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] をクリックしてアプリを実行 をクリックすると、Android デバイスまたはエミュレータにテキスト「Hello from C++」を表示するアプリが Android Studio によってビルドされ、起動されます。ここでは、サンプルアプリをビルドして実行する際に発生するイベントの概要を説明します。

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

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

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

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

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

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

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

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

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

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

参考情報

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

Codelabs