Использование clang из системы сборки NDK gradle

#android-ndk #gradle

#android-ndk #gradle

Вопрос:

Используя старую систему сборки Android на основе Makefile, можно использовать clang для компиляции исходных текстов, добавив

 NDK_TOOLCHAIN_VERSION=clang
 

Есть ли какой-нибудь способ добиться того же, используя новую систему сборки gradle?

Комментарии:

1. Безопаснее поместить NDK_TOOLCHAIN_VERSION=clang в свой Application.mk файл, не полагаясь на правильную командную строку. Как только он появится, ваш gradle подберет его.

Ответ №1:

На данный момент это невозможно напрямую, но вы все равно можете использовать обычные Make-файлы из gradle:

 import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'android'

android {
    ...
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs' //set jniLibs directory to ./libs
        jni.srcDirs = [] //disable automatic ndk-build call
    }

    // call regular ndk-build(.cmd) script from main src directory
    task ndkBuild(type: Exec) {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main').absolutePath
        }
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
}
 

Ответ №2:

В новых версиях NDK по умолчанию используется Clang.Однако вы можете явно запросить набор инструментов с помощью -DANDROID_TOOLCHAIN переключателя.

Начиная с плагина Android Gradle 2.2.0, все стало намного лучше. Вы также можете принять cmake . Вам следует ознакомиться с новой документацией.

 android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {

      // For ndk-build, instead use ndkBuild {}
      cmake {

        // Passes optional arguments to CMake.
        arguments "-DANDROID_TOOLCHAIN=clang"

        // Sets optional flags for the C compiler.
        cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"

        // Sets a flag to enable format macro constants for the C   compiler.
        cppFlags "-D__STDC_FORMAT_MACROS"
      }
    }
  }

  buildTypes {...}

  productFlavors {
    ...
    demo {
      ...
      externalNativeBuild {
        cmake {
          ...
          // Specifies which native libraries to build and package for this
          // product flavor. If you don't configure this property, Gradle
          // builds and packages all shared object libraries that you define
          // in your CMake or ndk-build project.
          targets "native-lib-demo"
        }
      }
    }

    paid {
      ...
      externalNativeBuild {
        cmake {
          ...
          targets "native-lib-paid"
        }
      }
    }
  }

  // Use this block to link Gradle to your CMake or ndk-build script.
  externalNativeBuild {
    cmake {...}
    // or ndkBuild {...}
  }
}