🔖

Android用コマンドラインアプリをC++&CMakeで作る

2022/04/17に公開

C++&CMakeを使ってAndroid用コマンドラインアプリを作る

AndroidでC++のテストや計測をしたいときに、Activityから作るのは面倒です。
C++オンリーでアプリを作成&実行ができると便利なので、備忘録として記事にしておきます。

作業環境

以下の環境で作成します。

  • Windows11

準備

Android用に必要なSDKなどをインストールします。
私はAndroidStudioからSDK Managerを起動してインストールしました。

  • Android SDK
  • Android NDK
  • Android Platform Tools
  • Android CMake (今回はバージョン3.18.1を使用)

環境変数の追加

コマンドが長くなるので、環境変数を追加しておきます。

  • ANDROID_SDK_ROOT
  • ANDROID_NDK_ROOT

プログラム作成

簡単な確認用のプログラムをmain.cppで作成します。

// main.cpp
#include <iostream>

int main (int, char*[])
{
    std::cout << "Hello Android!!\n";
    return 0;
}

ビルド用CMakeLists.txtを作成

実行ファイルを作成するためにCMakeLists.txtに記述していきます。

# CMakeLists.txt
cmake_minimum_required(VERSION 3.18.1)

project(Hello LANGUAGES C CXX)

add_executable(hello main.cpp)

ビルド&実行用のスクリプトを作成

コマンドプロンプトで打ち込むにはコマンドが長すぎるので、build_and_run.batファイルを作成しておきます。

@REM build_and_run.bat

@echo off

set CURRENT_DIR=%~dp0

@REM Check SDK
if not defined ANDROID_SDK_ROOT (
    echo "The environment variable ANDROID_SDK_ROOT is not defined."
    exit /b -1
)

if not exist %ANDROID_SDK_ROOT% (
    echo "ANDROID_SDK_ROOT=%ANDROID_SDK_ROOT% is not exist."
    exit /b -1
)

@REM Check NDK
if not defined ANDROID_NDK_ROOT (
    echo "The environment variable ANDROID_NDK_ROOT is not defined."
    exit /b -1
)

if not exist %ANDROID_NDK_ROOT% (
    echo "ANDROID_SDK_ROOT=%ANDROID_NDK_ROOT% is not exist."
    exit /b -1
)

@REM Check CMake
set CMAKE_VERSION=3.18.1
set ANDROID_CMAKE_PATH=%ANDROID_SDK_ROOT%\cmake\%CMAKE_VERSION%\bin
if not exist %ANDROID_CMAKE_PATH%\cmake.exe (
    echo "CMake (%CMAKE_VERSION%) is not available."
    exit /b -1
)

@REM Set build target
set BUILD_ABI=arm64-v8a
set BUILD_API_LEVEL=21
set BUILD_CONFIGURATION=Release

set BUILD_DIR=%CURRENT_DIR%\build_%BUILD_ABI%_%BUILD_API_LEVEL%_%BUILD_CONFIGURATION%

@REM Generate
%ANDROID_CMAKE_PATH%\cmake.exe ^
-GNinja ^
-DCMAKE_SYSTEM_NAME=Android ^
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON ^
-DCMAKE_SYSTEM_VERSION=%BUILD_API_LEVEL% ^
-DANDROID_PLATFORM=android-%BUILD_API_LEVEL% ^
-DANDROID_ABI=%BUILD_ABI% ^
-DCMAKE_ANDROID_ARCH_ABI=%BUILD_ABI% ^
-DANDROID_NDK=%ANDROID_NDK_ROOT% ^
-DCMAKE_ANDROID_NDK=%ANDROID_NDK_ROOT% ^
-DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK_ROOT%\build\cmake\android.toolchain.cmake ^
-DCMAKE_MAKE_PROGRAM=%ANDROID_CMAKE_PATH%\ninja.exe ^
-DCMAKE_CXX_FLAGS=-std=c++14 ^
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=lib ^
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=bin ^
-DCMAKE_BUILD_TYPE=%BUILD_CONFIGURATION% ^
-DANDROID_STL=c++_static ^
-B%BUILD_DIR%

@REM Build
%ANDROID_CMAKE_PATH%\cmake.exe --build %BUILD_DIR%

@REM Run
%ANDROID_SDK_ROOT%\platform-tools\adb.exe push %BUILD_DIR%\bin\hello /data/local/tmp/
%ANDROID_SDK_ROOT%\platform-tools\adb.exe shell chmod 775 /data/local/tmp/hello
%ANDROID_SDK_ROOT%\platform-tools\adb.exe shell /data/local/tmp/hello
%ANDROID_SDK_ROOT%\platform-tools\adb.exe shell rm -rf /data/local/tmp/hello

実行

作成したbuild_and_run.batを実行して、「Hello Android!!」が表示されれば成功です。

> build_and_run.bat

サンプル

本記事のプログラムはGitHubにて公開しています。

Discussion