Gradle Build Tools 2.2.0+ - Найближче до NDK коли-небудь називали `` магією ''
Намагаючись уникнути експериментів і відверто набрид NDK та всі його хакерські атаки, я радий, що вийшов 2.2.x від Gradle Build Tools, і зараз він просто працює. Ключ externalNativeBuild
і вказує ndkBuild
шлях аргумент на Android.mk
або зміни ndkBuild
в cmake
і вказати аргумент шляху у вигляді CMakeLists.txt
сценарію збірки.
android {
compileSdkVersion 19
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 19
targetSdkVersion 19
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'x86'
}
externalNativeBuild {
cmake {
cppFlags '-std=c++11'
arguments '-DANDROID_TOOLCHAIN=clang',
'-DANDROID_PLATFORM=android-19',
'-DANDROID_STL=gnustl_static',
'-DANDROID_ARM_NEON=TRUE',
'-DANDROID_CPP_FEATURES=exceptions rtti'
}
}
}
externalNativeBuild {
cmake {
path 'src/main/jni/CMakeLists.txt'
}
}
}
Для отримання більш детальної інформації перегляньте сторінку Google щодо додавання власного коду .
Після того, як це правильно налаштовано, ви можете ./gradlew installDebug
і виходити. Вам також потрібно знати, що NDK переходить у кланг, оскільки gcc зараз застарілий в Android NDK.
Інтеграція очищення та побудови Android Studio - ЗНИЖЕНА
Інші відповіді вказують на правильний спосіб запобігти автоматичному створенню Android.mk
файлів, але вони не можуть зробити додатковий крок для кращої інтеграції з Android Studio. Я додав можливість фактично очищати та будувати з джерела без необхідності переходити до командного рядка. Ваш local.properties
файл потрібно матиndk.dir=/path/to/ndk
apply plugin: 'com.android.application'
android {
compileSdkVersion 14
buildToolsVersion "20.0.0"
defaultConfig {
applicationId "com.example.application"
minSdkVersion 14
targetSdkVersion 14
ndk {
moduleName "YourModuleName"
}
}
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src/main/libs'
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
def ndkDir = android.ndkDirectory
commandLine "$ndkDir/ndk-build",
'-C', file('src/main/jni').absolutePath,
'-j', Runtime.runtime.availableProcessors(),
'all',
'NDK_DEBUG=1'
}
task cleanNative(type: Exec, description: 'Clean JNI object files') {
def ndkDir = android.ndkDirectory
commandLine "$ndkDir/ndk-build",
'-C', file('src/main/jni').absolutePath,
'clean'
}
clean.dependsOn 'cleanNative'
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
}
dependencies {
compile 'com.android.support:support-v4:20.0.0'
}
src/main/jni
Каталог передбачає стандартний макет проекту. Це має бути відносна з цього build.gradle
розташування файлу до jni
каталогу.
Gradle - для тих, хто має проблеми
Також перевірте цю відповідь на переповнення стека .
Дійсно важливо, щоб ваша версія gradle та загальні налаштування були правильними. Якщо у вас є старий проект, я настійно рекомендую створити новий із останньою версією Android Studio і подивитися, що Google вважає стандартним проектом. Також використовуйте gradlew
. Це захищає розробника від невідповідності версії gradle. Нарешті, плагін gradle повинен бути налаштований правильно.
І ви запитаєте, яка остання версія плагіна gradle? Перевірте сторінку інструментів та відредагуйте версію відповідно.
Кінцевий продукт - /build.gradle
task wrapper(type: Wrapper) {
gradleVersion = '2.2'
}
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.0'
}
}
allprojects {
repositories {
jcenter()
}
}
Переконайтеся, що gradle wrapper
генерує gradlew
файл та gradle/wrapper
підкаталог. Це велика проблема.
ndkDirectory
Це траплялося кілька разів, але android.ndkDirectory
це правильний спосіб отримати папку після 1.1. Міграція проектів Gradle до версії 1.0.0 . Якщо ви використовуєте експериментальну або старовинну версію плагіна, ваш пробіг може відрізнятися.