- C++ライブラリを含んだAndroidアプリを作成したいが、アプリをビルドして実行するのに時間がかかる。効率が悪いのでなんとかしたい。
- C++ライブラリを端末上にインストールして直接実行してテストしようと試みたが、実行権限が取れず諦めた。
- エミュレータが重い。嫌い。C++ライブラリを作るのにAndroid Studioはいらない。
Android上で動作するc++ライブラリを効率よく開発できないかと思い、いろいろ試してみた結果1つの解決策にたどり着きました。その方法を紹介します。
環境準備
開発環境
- OS:Windows10 64bit Pro リビジョン1804
私が試した環境はwindowsを使いましたが、Linuxでもmacでもどれでもできると思います。あくまでC++のライブラリをビルドする環境でしかないのでなんでも大丈夫です。
- Android NDK :リビジョン16b
- Android SDK
adbコマンドで端末にアクセスする必要があります。Andoirod SDK platform-toolsをインストールして、adbツールのパスを通しておきます。
SDKのインストールからadbコマンドを利用するまでの手順は以下のサイトが非常に参考になります。
Android SDKをインストールして、ADBコマンドが使えるようにする方法
なお、Android StudioやEclipse等のIDEは不要です。
実機環境
- SH-M07
- Android OS:8.0 (Oreo)
実機環境としてSHARPを使いましたが、先ほどのホストPCと同様、Android端末であればなんでも大丈夫だと思います。
Android端末にUSB経由でadb接続するため、端末側の開発者向けオプションのUSBデバッグをONにしておきます。
実行ファイルの作成
動作確認を行いたいandroid上で動作するc++ライブラリ(*.so | *.a)を作成します。
作成したライブラリをAndroidアプリ(Java)から呼び出すのではなく、C++から呼び出す実行ファイルを作成します。
動作確認をしたいライブラリをlibA.aとすれば、実行ファイルB.outがlibA.aをリンクしたものです。
Android上でroot権限なしでC++ライブラリを実行する
環境の準備ができたら次は実行ファイルをAndroid上で動かします。
方法はいたってシンプルです。
実行したいファイルをadb push /data/local/tmp
開発しているPCとUSBで接続し、以下のコマンドで実行ファイルをAndroid端末上に送ります。
add push B.out /data/local/tmp
次にadb shellコマンドで端末にアクセスし、実行権限を付与します。
adb shell
SH-M07¥ > cd /data/local/tmp
SH-M07¥ > chmod +x B.out
ls -lコマンドで確認してみると、実行権限が付与できているじゃないですか。
実行します。
SH-M08¥ > ./B.out
ちゃんと実行できると思います。
C++の開発がめっちゃ捗る
SDカードを含む他の場所では管理グループがrootになっているため、root権限を取れない端末ではC++の実行ファイルを直接動かすことはできません。AndroidアプリとしてJavaのエントリーポイント(JNI)を経由してc++ライブラリを呼び出す必要がありました。
また、Android Studioを使ったC++開発だと、Android Studioの動作の重さやapkとしてビルド&インストールするオーバーヘッドにより、開発効率が非常に悪いなと感じていてなんとかしたいと思っていました。
今回の方法を利用すればコンソールアプリとして実行させることができるので、昔ながらのprintfを使ったデバッグ方法や、更にはCppUnitやgoogletestといったC++のユニットテストをAndroid上で実行することができ、テストの自動化への道に繋がっていくと思います。
Javaを知らないc++エンジニアであっても、簡単なadbコマンドさえ覚えてしまうだけで、今までのC++と同じ感覚で開発ができるのは非常にメリットがあると思います。