Android Studio 2.3.x(gradle plugin 2.3.x)でも昔ながらの方法でndk-buildを使う方法をあみだしました。一番乗り〜\(^o^)/
Android Studio 2.3.x(gradle plugin 2.3.x)では今までのsdkHandlerを参照してNDKのインストール先を取得する方法が使えなくなりました。
#issue235754にも上がってますが、コメントを見る限りでは、「内部用のsdkHandlerを勝手に参照してんねんから動かなくなったって知るかい」っとのたもう感じです。
Android Studio 2.2.x(gradle plugin2.2.x)以降で追加された、新しいNDKサポート機能ではCmakeを使うのが推奨の方法ですが、一応Android.mkとndk-buildを使ったネイティブライブラリのビルドもサポートされています
なぜわざわざ一応と書いたかというと、Android StudioでNDKのビルド〜ぱーとすりぃ〜で書きましたが、今までndk-buildを使って生成したものとは全く違うバイナリが生成されるからです。というか、サイズが2-4倍ってあんた。
gradleからndk-buildを呼び出すには、Android Studio 2.2.x(gradle plugin2.2.x)までは次のようにしていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import org.apache.tools.ant.taskdefs.condition.Os ... task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') { println('executing ndkBuild') def ndkBuildingDir = project.plugins.findPlugin('com.android.library').sdkHandler.getNdkFolder().absolutePath def ndkBuildPath = ndkBuildingDir if (Os.isFamily(Os.FAMILY_WINDOWS)) { ndkBuildPath = ndkBuildingDir + '/ndk-build.cmd' } else { ndkBuildPath = ndkBuildingDir + '/ndk-build' } commandLine ndkBuildPath, '-j4', '-C', file('src/main').absolutePath } |
applicationモジュールの場合は’com.android.library’を’com.android.application’に読み替えてください。
これが、Android Studio 2.3.x(gradle plugin 2.3.x)ではsdkHandlerへアクセスできなくなってしまったためうまく動かなくなったわけです。
非公式な方法を使うのが悪いじゃとのたまわれたんじゃ収まりません(●`ε´●)
という事でgradle公式な方法で同じプロパティを参照してやろうやないかと。
で出来上がったのがこちら。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import org.apache.tools.ant.taskdefs.condition.Os ... task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') { println('executing ndkBuild') Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def ndkBuildingDir = properties.getProperty("ndk.dir") def ndkBuildPath = ndkBuildingDir if (Os.isFamily(Os.FAMILY_WINDOWS)) { ndkBuildPath = ndkBuildingDir + '/ndk-build.cmd' } else { ndkBuildPath = ndkBuildingDir + '/ndk-build' } commandLine ndkBuildPath, '-j4', '-C', file('src/main').absolutePath } |
見比べてもらえばわかりますが、gradle pluginを当てにするのを止めて、代わりにプロジェクトルート直下にある”local.properties”ファイルの”ndk.dir”に割り当てられている値を自前で参照しています。
あとの呼び出し方は一緒ね。使っているのが’com.android.library’でも’com.android.application’でも関係なく動きます。しかも、Android Studio 2.2.x(gradle plugin2.2.x)までで生成したバイナリとバイト単位で一致します。
この方法がええのは、Android Studio 2.3.x(gradle plugin 2.3.x)だけじゃなくて、Android Studio 2.2.x(gradle plugin 2.2.x)以前でも、コマンドラインからndk-buildを直接叩いても、gradle経由でもはてまたeclipseへ読み込んでビルドしても、同じ中間ファイルが同じ場所にできて、バイト単位で同じバイナリになること。
これなら文句あらへんやろ。( ・´ー・`)どや