Android StudioでNDKを使ったビルドをする

  • 18
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

なかなかAndroid StudioがNDKサポートを追加しないので、gradleの仕組みを使ってとりあえずNDK対応してみる。
参考にしたのはOculus Mobile SDKのソース。

やり方

アプリのbuild.gradleに、次のコードを追加する。一番下とかで良いです。

// ANDROID_NDK_HOME
// ANDROID_NDK
// NDKROOT
// local.properties の ndk.dir
// の順にNDKのパスを検索して、ndk-buildのフルパスを取得する
def GetNDKBuildCmd() {

    def ndkDir = System.getenv('ANDROID_NDK_HOME')
    if (ndkDir == null) {
        ndkDir = System.getenv('ANDROID_NDK')
    }
    if (ndkDir == null) {
        ndkDir = System.getenv('NDKROOT')
    }
    if (ndkDir == null) {
        Properties properties = new Properties()
        properties.load(project.rootProject.file('local.properties').newDataInputStream())
        ndkDir = properties.getProperty('ndk.dir')
    }
    if (ndkDir == null) {
        throw new GradleException('NDK not found! Check your environment for ANDROID_NDK or your local.properties contains ndk.dir')
    }
    if (OperatingSystem.current().isWindows()) {
        return ndkDir + '/ndk-build.cmd'
    } else {
        return ndkDir + '/ndk-build'
    }
}

project.afterEvaluate {
    compileDebugNdk.dependsOn 'NDKBuildDebug'
    compileReleaseNdk.dependsOn 'NDKBuildRelease'
    clean.dependsOn 'NDKBuildClean'
}

task NDKBuildDebug(type: Exec) {
    commandLine GetNDKBuildCmd(), 'V=0', '-j10', 'NDK_DEBUG=1', 'OVR_DEBUG=1', "NDK_PROJECT_PATH=$projectDir/src/main"
}

task NDKBuildRelease(type: Exec) {
    commandLine GetNDKBuildCmd(), 'V=0', '-j10', 'NDK_DEBUG=0', 'OVR_DEBUG=0', "NDK_PROJECT_PATH=$projectDir/src/main"
}

task NDKBuildClean(type: Exec) {
    commandLine GetNDKBuildCmd(), 'clean', "NDK_PROJECT_PATH=$projectDir/src/main"
}

そして、android -> sourceSets -> main のブロック内にjniライブラリの設定を追加する。

android {
    ...

    sourceSets {
        main {
            jniLibs.srcDir 'src/main/libs'
            jni.srcDirs = [] // レガシー ndk-build サポートを無効にする
        }
    }
}

これで、Android Studioのビルドを走らせた時に ndk-build が呼ばれ、APKに含まれるようになります。