概要
Android Studio の NDK 対応が、従来の Android.mk
によるものを十分に置き換えることができるようになるまでの過程を追っかけます。
今後の対応の予想
2015/12/18 時点では、まだ正式な NDK 対応ではなく、理想的な NDK 開発はできません。そもそも Gradle が C/C++ をサポートしたのが最近のことですし、従来の Android.mk
スタイルの開発の方が無難と言えそうです。
しかし、以下を見る限り Gradle は Android NDK だけではなく Clang、GCC、Xcode、Visual Studio のツールチェインにも対応し、C/C++ だけでなくアセンブリ、Objective-C にも対応していくように思えます(もしくは Gradle 2.9 で既に対応している?)。
- Chapter 56. Building native binaries
- gradle/subprojects/docs/src/samples/native-binaries at gradle/gradle
プラットフォームも Android だけでなく Linux、OS X、iOS、Windows にも対応していくように思えます。Eclipse や他の IDE から移行さえちゃえという本気度が伺えますね。
マルチプラットフォーム、マルチツールチェインに対応したネイティブのビルドツールといえば、最近だと Swift のビルドを支えている CMake、Google 製プロダクトのビルドを支えている GYP、GN と Ninja の組み合わせがありましたが、Gradle がそこまでやってくれるのであれば徐々に移行を考えていきたいところですね。
時間はかかりそうですが、非常に楽しみです!
更新履歴
Pluging 0.4.0
複数の NDK プロジェクトの対応と、ただのネイティブライブラリを作れるようになっています。まだ完全ではありません。Gradle でコンパイルすることはできますが、編集はデバッグにはまだサポートされていません。
ただのネイティブライブラリ
gradle-experimental:0.4.0 では、Android アプリケーション・ライブラリなしのただのネイティブライブラリを作れるようになっています。DSL は Android アプリケーション・ライブラリに似ています。以下のサンプルは src/main/jni
のソースをビルドして libhello.so
を作ります。
apply plugin: "com.android.model.native"
model {
android {
compileSdkVersion = 21
}
android.ndk {
moduleName = "hello"
}
}
ただし、ソースを編集したら手動でビルドしないとアプリケーションに再リンクされません。
NDK の依存関係
以下のようなネイティブライブラリプロジェクトがあったとすると・・・
apply plugin: "com.android.model.native"
model {
android {
compileSdkVersion = 21
}
android.ndk {
moduleName = "hello"
}
}
アプリケーションでは以下のようにして参照することができます。
apply plugin: "com.android.model.application"
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.0"
}
android.sources {
main {
jni {
dependencies {
project ":lib1"
}
}
}
}
}
詳細は省きますが、Gradle の旨味のひとつである flavor にも対応しているようです。
Pluging 0.6.0
ものはあるようですがドキュメントがまだありません。