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'
}
//ndkBuild {
// path 'src/main/jni/Android.mk'
//}
}
}
Более подробную информацию можно найти на странице Google, посвященной добавлению нативного кода.
После правильной настройки вы можете ./gradlew installDebug
и вперед. Вам также необходимо знать, что NDK переходит на clang, поскольку 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 = [] // This prevents the auto generation of Android.mk
jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries in your project.
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
def ndkDir = android.ndkDirectory
commandLine "$ndkDir/ndk-build",
'-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
'-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, // Change src/main/jni the relative path to your jni source
'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
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// Running 'gradle wrapper' will generate gradlew - Getting gradle wrapper working and using it will save you a lot of pain.
task wrapper(type: Wrapper) {
gradleVersion = '2.2'
}
// Look Google doesn't use Maven Central, they use jcenter now.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
Убедитесь, что gradle wrapper
создает файл gradlew
и подкаталог gradle/wrapper
. Это большая ошибка.
ндкдиректори
Это встречалось несколько раз, но android.ndkDirectory
— правильный способ получить папку после версии 1.1. Миграция проектов Gradle в версию 1.0.0< /а>. Если вы используете экспериментальную или старую версию плагина, ваш пробег может отличаться.
person
Cameron Lowell Palmer
schedule
01.11.2014