やりたいこと
Javaで実装したAndroidのライブラリモジュールがあります。これを C++ で再実装したいので、C++のコードを書く前に、Androidのプロジェクトの設定を行います。
環境
- OS Windows 10
- Android Studio 3.4.1
- Gradle 5.1.1
Android Studio にコンポーネントを追加
公式ドキュメントの「NDK とビルドツールのダウンロード 」 に従って 必要なツールを SDK Manager の SDK Tools からインストールします。
- LLDB
- CMake
- NDK
手順
cpp のソースファイルを追加
- [Project] ペインを開き、ペイン内上部のプルダウンから Projectに変更します。
- プロジェクト名 -> モジュール名 -> src ディレクトリ -> main ディレクトリ の配下に cpp ディレクトリを作成します。
- 作成した cpp ディレクトリで 右クリックして、[New] > [C/C++ Source File] を選択します。
- ソースファイルの名前(native-lib など)を入力し、[Create an associated header]にチェックをつけて、[OK]をクリックします。
CMakelists.txt を追加
- プロジェクト名 -> モジュール名 で右クリックして、[New] > [File]を選択します。
- ファイル名に CMakeLists.txt を入力して、[OK]をクリックします。
CMakeLists.txt にビルド対象を追加
# ビルドに必要なCMakeの最小バージョン
cmake_minimum_required(VERSION 3.4.1)
# ビルドするライブラリの定義
add_library( # ライブラリ名. 作成されるライブラリのファイル名は「lib[下の名前].so」になる
native-lib
# 静的リンクと動的リンクの指定
SHARED
# ライブラリを構成するソースファイル
# C もしくは C++ のファイルを増やした時にはここに追加する
src/main/cpp/native-lib.cpp )
# ヘッダーファイルがあるディレクトリのパス
include_directories(src/main/cpp/include/)
cmake_minimum_required は CMakeの最小バージョンを指定します。Cmakeは SDK Mangerの「Android SDK Location」配下の cmake ディレクトリにインストールされています。
CMakeLists.txt にNDK APIを追加
NDK APIを利用するために、利用するライブラリの場所と、リンクするライブラリを明示します。
# 使用するライブラリの場所
find_library( # NDKライブラリのパスが代入される変数名
log-lib
# NDKライブラリのパス
log)
# リンクするライブラリを明示する
target_link_libraries( # 出力するライブラリ.
native-lib
# リンクするライブラリ ld -llog-lib に相当する.
${log-lib})
Gradle に追加
プロジェクト名 -> モジュール名 で右クリックして、[Link C++ Project with Gradle]を選択します。
ファイル選択のダイアログが表示されたら、Build Systemが CMake であることを確認し、 CMakeLists.txt のパスを指定します。
Gradleに追加された結果を確認
- [Project]ペインのプルダウンを Android に変更すると、C++のファイルが追加されていることを確認できます。
-
<project-root>/<module-root>/build.gradle
に externalNativeBuild が追加されています。
android {
~ 色々省略 ~
externalNativeBuild {
cmake {
path file('CMakeLists.txt')
}
}
}
ビルドを実行
Android StudioでC++を含むプロジェクトを新規に作成した時に生成されたサンプル使ってビルドを試します。
ここまでの手順で作成した <project-root>/<module-root>/src/main/cpp/native-lib.cpp
を下のコードにします。
#include <jni.h>
#include <string>
#include "native-lib.h"
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_mynativeapplication_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
Android Studioの [build] -> [Make Project]を選択して、プロジェクトをビルドします。
ビルドして作成されたライブラリは <project-root>/<module-root>/build/intermediates/cmake/<build-type>/obj/<ABI>/lib[ライブラリ名].so
です。ABIは https://developer.android.com/ndk/guides/abis.html#sa を参照してください。