生存報告

仕事でバックエンド、趣味でフロントエンド・デザイン

Android NDKでC++をビルドしてAndroid上で実行ファイルを動かしたい

はじめに

題名どおりC++をビルドして、バイナリファイルをAndroid上で実行します。
ビルドにAndroid NDKを使いましたよーって話です。

ローカル環境

Androidの環境

環境構築

  • Tools -> SDK ManagerよりAndroidNDKをインストール
  • ndk-buildコマンドが使えるようにパスを通す(以下のように~/.bash_profileに追記)
export PATH=$PATH:/Users/ユーザ名/Library/Android/sdk/ndk/22.0.7026061

ソースコード

  • HelloWorld.cppを作成(Project名/app/src/HelloWorld.cpp)
#include <stdio.h>

int main(int argc, char *argv[]) {
printf("Hello world.\n");
return 0;
}

ビルドの設定ファイル

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloWorld
LOCAL_SRC_FILES := HelloWorld.cpp

include $(BUILD_EXECUTABLE)
  • Application.mkを作成(Project名/Application.mk)
APP_PROJECT_PATH := /Users/ユーザ名/AndroidStudioProjects/プロジェクト名
APP_ABI := arm64-v8a       #CPUアーキテクチャを設定(複数設定可能)
APP_PLATFORM := android-28 #APIレベルを設定

#ターゲットのAndroid.mkを指定
APP_BUILD_SCRIPT := /Users/ユーザ名/AndroidStudioProjects/プロジェクト名/app/src/Android.mk

ビルド実行

  • プロジェクト直下で以下を実行
ndk-build NDK_PROJECT_PATH=${PWD} NDK_APPLICATION_MK="\$(NDK_PROJECT_PATH)/Application.mk"

ファイルの転送

adb push プロジェクト名/libs/arm64_v8a/HelloWorld /data/data/パッケージ名/HelloWorld

端末で実行

  • ルート権限でログインして実行ファイルを実行
adb root
adb shell
chmod 555 /data/data/パッケージ名/HelloWorld
/data/data/パッケージ名/HelloWorld
  • 実行結果
Hello World

参考記事様方