Android Studio で C++ を使ってアプリを作る
お久しぶりです
C++で書いていたコードをAndroidのアプリで使えるよう頑張っていたのですが、詰まってしまったところがあり、日本語のものが少なかったため、後進のためにも注意する点を残しておきます
Android Studio
Android Studioは、Android アプリ開発用の公式の統合開発環境(IDE)です
インストール方法などはこちらにあります
主にJavaやKotlinで開発を行いますが、CやC++のコードを利用することもできます(ただし、NDKが必要です(Android Studioからインストール可能))
C/C++を使うプロジェクトを作成
新規プロジェクトを作成する際に「Native C++」を選びましょう(サンプルコードが初めからあります)
そのままビルドして実行を押すとエミュレータが起動しAndroidの画面に「Hello from C++」と表示されるはずです(バージョンが変わることで変更されることもあります)
これでC/C++を使って開発するための下地はできました
C/C++のオープソースライブラリや自作ライブラリを使わない場合にはこのままC++のコードを書いたり、Javaなどで画面の表示や処理などを変えたりしていくだけです
C/C++のライブラリを使う場合
ヘッダーオンリーライブラリならばヘッダーファイルを追加し、そのヘッダファイルのあるディレクトリをCmakelist.txtに追記する必要があります
書き方はこんな感じ(絶対パスで書きましょう)
include_directories(/path/to/header/file/dir)
共有ライブラリや静的ライブラリも必要な場合には少し厄介です
PC上でビルドしたライブラリはAndroid上では使えないため、Android用にビルドする必要があります
その方法としてはこちらに公式のドキュメントがあるのでこれに則れば大抵は大丈夫です
また、githubなどでビルド済みのライブラリを公開してくださっている方もいるのでそれを使っても良いでしょう
ライブラリAが他のライブラリBを必要とする場合は、BをAndroid用にビルドしてからAがBを利用してビルドするように指定する必要があります
裏技(ではないけど)として、ライブラリがcmakeを使ってビルドするものであれば、Android Studioに適切にソースコードなどを配置しcmakeを書き換えることでAndroid用にビルドすることも可能です
例として「OpenSSL」を使う場合で解説していきます
プロジェクト名はtest、C++関連のディレクトリは以下のようとします
cpp
├─include
│ └─openssl
│ └─sha.hなど
├─lib
│ ├─crypto.a
│ └─ssl.a
├─main.cpp
└─Cmakelist.txt
まず、OpenSSLを公式サイトなどからダウンロードし、Android用のライブラリ(今回は静的ライブラリ)を先述の方法などでビルドします(アーキテクチャに注意してライブラリをビルドしてください)
次にmain.cppに自分が行いたい処理を書きます(このとき、Javaなどから呼び出す際やリターンする際に守る規則のようなものがあるので注意します。詳しくは調べてください)
Cmakelist.txtに必要なものを加えていきます(新規プロジェクトを作成した際に初めからあるものに書き足すだけでいいはずです)
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)
# testという共有ライブラリをmain.cppからビルド
add_library(test SHARED main.cpp)
# ${PROJECT_SOURCE_DIR}はcppディレクトリの絶対パスを指す環境変数みたいなもの
# 静的ライブラリの追加
# 共有ライブラリならSTATICをSHEAREDに変更し、.aを.soに
# ライブラリへのパスは絶対パスに
add_library(crypto STATIC IMPORTED)
set_target_properties(crypto
PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/libcrypto.a)
add_library(ssl STATIC IMPORTED)
set_target_properties(ssl
PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/libssl.a)
# ヘッダーファイルのディレクトリ指定
target_include_directories(test PRIVATE ${PROJECT_SOURCE_DIR}/include)
# ライブラリのリンク
target_link_libraries(test crypto ssl)
# コンパイルオプションをつけたい時 cmakeの書き方にのっとればOKです
target_compile_options(test PRIVATE -fPIC) #など
# NDKのライブラリを使いたい場合(logというライブラリを使いたい場合)
find_library(log-lib log)
target_link_libraries(test ${log-lib})
これでビルドボタンを押してエラーがなければビルド成功です
エミュレータ上で実行するには実行ボタンを押せばエミュレータが起動し、作ったアプリがエミュレータにインストールされ実行されます
ここでAndroid Studioの下部にあるLogcatを開き、エラーが吐かれたりしていなければ成功です
実機でテストしたい場合には、USBなどで接続して実機にインストールされるようにすればいけるはずです
まとめ
これである程度自由にC/C++を使ってAndroidアプリを作れるようになったと思いますが、C/C++の部分は最小限にしておくのがいいのではないかなと思います(高速化したい部分だけC/C++で書くとか)
アプリを作る際にはAndroidのアーキテクチャに注意してライブラリのビルドやアプリの作成をしてください(build.gradleに対象とするアーキテクチャを書くことでそのアーキテクチャのみのアプリを作ることもできます)
今度は誰かがJavaだけでAndroidアプリを作るときに気をつけることを書いてくれるといいなと思っています