#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 {...}
}
}