Студия Android, gradle и NDK

Я очень новичок в этой поддержке gradle и Android Studio. Мне удалось преобразовать проект андроида в gradle с помощью опции экспорта.

Но я ищу некоторую документацию или отправную точку, как интегрировать сборку NDK в процесс сборки gradle.

Если возможно, мне также нужен какой-то "после" этап, который копирует двоичные файлы сборки (.so файлы) в каталог ресурсов.

Ответ 1

Мы выпустили первую версию интеграции в виде предварительного просмотра в версии 1.3: http://tools.android.com/tech-docs/android-ndk-preview

Интеграция останется предварительной, даже после того, как 1.3 станет окончательным. Нет текущей ETA, когда она будет окончательной (по состоянию на 2015/07/10).

Дополнительная информация здесь: http://tools.android.com/tech-docs/android-ndk-preview

Ответ 2

ОБНОВЛЕНИЕ: Android-студия с поддержкой NDK отсутствует: http://tools.android.com/tech-docs/android-ndk-preview

Для построения с помощью script ниже должно использоваться решение gradle ниже:

Я использую мою сборку script и добавлен в мой файл (Кажется, работает для 0.8+): Это похоже на решение ниже (но выглядит лучше в файле gradle):

 android {
    sourceSets {
        main {
            jniLibs.srcDirs = ['native-libs']
            jni.srcDirs = [] //disable automatic ndk-build
        }
    }
 }

Сборка, к сожалению, не сбой, если каталог отсутствует или не содержит файлов .so.

Ответ 3

Благодаря обновлению Android Studio до 1.0 поддержка инструментальных средств NDK значительно улучшилась (примечание : прочитайте мои обновления в нижней части этого сообщения, чтобы увидеть использование нового экспериментального плагина Gradle и Android Studio 1.5).

Android Studio и NDK интегрированы достаточно хорошо, так что вам просто нужно создать блок ndk {} в модуле build.gradle и установить исходные файлы в каталог (module)/src/main/jni - и все готово!

Нет больше ndk-build из командной строки.

Я написал все об этом в своем блоге: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/

Основные моменты:

Здесь вам нужно знать две вещи. По умолчанию, если у вас есть внешние библиотеки, которые вы хотите загрузить в приложение для Android, их по умолчанию ищут в (module)/src/main/jniLibs. Вы можете изменить это, используя настройку sourceSets.main.jniLibs.srcDirs в своих модулях build.gradle. Вам понадобится подкаталог с библиотеками для каждой ориентированной вами архитектуры (например, x86, arm, mips, arm64-v8a и т.д.)

Код, который вы хотите скомпилировать по умолчанию с помощью инструментальной цепи NDK, будет находиться в (module)/src/main/jni и аналогично выше, вы можете изменить его, установив sourceSets.main.jni.srcDirs в своих модулях build.gradle

и поместите это в свой модуль build.gradle:

ndk {
  moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
  cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
  stl "gnustl_shared" // Which STL library to use: gnustl or stlport
}

Это процесс компиляции кода на С++, оттуда вам нужно загрузить его и создать обертки - но, судя по вашему вопросу, вы уже знаете, как это сделать, поэтому я не буду повторно хешировать.

Кроме того, я разместил здесь репозиторий Github: http://github.com/sureshjoshi/android-ndk-swig-example

ОБНОВЛЕНИЕ: 14 июня 2015 г.

Когда выйдет Android Studio 1.3, должна быть улучшена поддержка С++ через плагин JetBrains CLion. В настоящее время я предполагаю, что это позволит разрабатывать Java и С++ из Android Studio; однако я думаю, что нам все равно придется использовать раздел Gradle NDK, как я уже говорил выше. Кроме того, я думаю, что все еще будет необходимо писать файлы оболочки Java ↔ С++, если CLION не сделает это автоматически.

ОБНОВЛЕНИЕ: 5 января 2016 г.

Я обновил свой блог и реплику Github (в ветке разработки), чтобы использовать Android Studio 1.5 с последним экспериментальным плагином Gradle (0.6.0-alpha3).

http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/ http://github.com/sureshjoshi/android-ndk-swig-example

Конструкция Gradle для секции NDK теперь выглядит следующим образом:

android.ndk {
    moduleName = "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
    cppFlags.add("-std=c++11") // Add provisions to allow C++11 functionality
    cppFlags.add("-fexceptions")
    stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
}

Кроме того, довольно удивительно, Android Studio имеет автозаполнение для С++ - Java-оболочки, использующие ключевое слово 'native':

Пример автозаполнения С++ - Java-оболочки

Однако, это не совсем радужно... Если вы используете SWIG, чтобы обернуть библиотеку для автоматического генерации кода, а затем попытайтесь использовать автогенерацию собственного ключевого слова, она поместит код в неправильное место в ваш файл Swig _wrap.cxx... Поэтому вам нужно переместить его в блок "extern C":

С++ - оболочка Java перемещена в нужное место

ОБНОВЛЕНИЕ: 15 октября 2017 г.

Я бы отказался, если бы не упоминал, что Android Studio 2.2 имеет по существу "родную" (без каламбуров) поддержку инструментальной привязки NDK через Gradle и CMake. Теперь, когда вы создаете новый проект, просто выберите поддержку на С++, и вам хорошо идти.

Вам все равно нужно создать собственный код уровня JNI или использовать технику SWIG, о которой я упомянул выше, но строительные леса проекта С++ в Android теперь тривиальны.

Изменения в файле CMakeLists (который размещает ваши исходные файлы на С++) будут подхвачены Android Studio, и он автоматически перекомпилирует любые связанные библиотеки.

Ответ 4

В Google IO 2015 компания Google объявила о полной интеграции NDK в Android Studio 1.3.

Теперь он недоступен для просмотра и доступен всем: https://developer.android.com/studio/projects/add-native-code.html

Старый ответ: Gradle автоматически вызывает ndk-build, если в источниках проекта есть каталог jni.

Это работает на студии Android 0.5.9 (canary build).

  • Загрузить NDK
  • Либо добавьте ANDROID_NDK_HOME в переменные среды, либо добавьте ndk.dir=/path/to/ndk в ваш local.properties в вашем проекте Android Studio. Это позволяет студии Android запускать ndk автоматически.
  • Загрузите последние Gradle примеры проектов, чтобы увидеть пример проекта ndk. (Они находятся в нижней части страницы). Хороший образец проекта ndkJniLib.
  • Скопируйте gradle.build из типовых проектов NDK. Это будет выглядеть примерно так. Этот gradle.build создает для каждой архитектуры другой apk. Вы должны выбрать, какую архитектуру вы хотите использовать с помощью панели build variants. build variants pane

    apply plugin: 'android'
    
    dependencies {
        compile project(':lib')
    }
    
    android {
        compileSdkVersion 19
        buildToolsVersion "19.0.2"
    
        // This actual the app version code. Giving ourselves 100,000 values [0, 99999]
        defaultConfig.versionCode = 123
    
        flavorDimensions "api", "abi"
    
        productFlavors {
            gingerbread {
                flavorDimension "api"
                minSdkVersion 10
                versionCode = 1
            }
            icecreamSandwich {
                flavorDimension "api"
                minSdkVersion 14
                versionCode = 2
            }
            x86 {
                flavorDimension "abi"
                ndk {
                    abiFilter "x86"
                }
                // this is the flavor part of the version code.
                // It must be higher than the arm one for devices supporting
                // both, as x86 is preferred.
                versionCode = 3
            }
            arm {
                flavorDimension "abi"
                ndk {
                    abiFilter "armeabi-v7a"
                }
                versionCode = 2
            }
            mips {
                flavorDimension "abi"
                ndk {
                    abiFilter "mips"
                }
                versionCode = 1
            }
            fat {
                flavorDimension "abi"
                // fat binary, lowest version code to be
                // the last option
                versionCode = 0
            }
        }
    
        // make per-variant version code
        applicationVariants.all { variant ->
            // get the version code of each flavor
            def apiVersion = variant.productFlavors.get(0).versionCode
            def abiVersion = variant.productFlavors.get(1).versionCode
    
            // set the composite code
            variant.mergedFlavor.versionCode = apiVersion * 1000000 + abiVersion * 100000 + defaultConfig.versionCode
        }
    
    }
    

Обратите внимание, что это игнорирует ваши файлы Android.mk и Application.mk. В качестве обходного пути вы можете сообщить Gradle отключить atuomatic вызов ndk-build, а затем вручную указать каталог для источников ndk.

sourceSets.main {
    jniLibs.srcDir 'src/main/libs' // use the jni .so compiled from the manual ndk-build command
    jni.srcDirs = [] //disable automatic ndk-build call
}

Кроме того, вы, вероятно, захотите напрямую вызвать ndk-build в свой Gradle build script, потому что вы просто отключили автоматический вызов.

task ndkBuild(type: Exec) {
   commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
}

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

Ответ 5

Я нашел "gradle 1.11 com.android.tools.build:gradle:0.9.+" теперь поддерживает предварительную сборку ndk, вы можете просто поместить *.so в каталог dir src/main/jniLibs. при построении gradle будет пакет ndk в нужном месте.

вот мой проект

Project:
|--src
|--|--main
|--|--|--java
|--|--|--jniLibs
|--|--|--|--armeabi
|--|--|--|--|--.so files
|--libs
|--|--other.jar

Ответ 7

На данный момент (Android Studio v0.8.6) это довольно просто. Ниже приведены шаги по созданию приложения типа "Hello world":

  • Загрузите Android NDK и поместите корневую папку куда-нибудь здраво - в том же месте, что и папка SDK, возможно.

  • Добавьте в свой local.properties файл следующее: ndk.dir=<path-to-ndk>

  • Добавьте следующее в ваш файл build.gradle внутри закрытия defaultConfig сразу после строки versionName: ndk { moduleName="hello-world" }

  • В вашем каталоге приложений main создайте новую папку под названием jni.

  • В этой папке создайте файл с именем hello-world.c, который вы увидите ниже.

  • Ниже приведен пример кода Activity для примера того, как вызвать метод (или это функция?) в hello-world.c.


hello-world.c

#include <string.h>
#include <jni.h>

jstring
Java_me_mattlogan_ndktest_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz)
{
    return (*env)->NewStringUTF(env, "Hello world!");
}

MainActivity.java

public class MainActivity extends Activity {

    static {
        System.loadLibrary("hello-world");
    }

    public native String stringFromJNI();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String testString = stringFromJNI();

        TextView mainText = (TextView) findViewById(R.id.main_text);
        mainText.setText(testString);
    }
}

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "me.mattlogan.ndktest"
        minSdkVersion 15
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "hello-world"
        }
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Найти полный исходный код очень похожего приложения здесь (минус NDK).

Ответ 8

Если вы используете unix, последняя версия (0.8) добавляет ndk-build. Здесь, как добавить его:

android.ndk {
    moduleName "libraw"
}

Он рассчитывает найти JNI в разделе 'src/main/jni', иначе вы можете определить его с помощью

sourceSets.main {
    jni.srcDirs = 'path'
}

Начиная с 28 JAN 2014 с версией 0.8 сборка разбивается на окна, вам нужно отключить сборку с помощью:

sourceSets.main {
    jni.srcDirs = [] //disable automatic ndk-build call (currently broken for windows)
}

Ответ 9

Элегантное обходное решение показано в https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J.

В основном вы создаете банку, которая содержит "lib/armeabi/yourlib.so", а затем включайте банку в сборку.

Ответ 10

Хороший ответ, автоматизирующий упаковку скомпилированных .so файлов, приведен в другом (закрытом) потоке. Чтобы получить эту работу, мне пришлось изменить строку:

from fileTree(dir: 'libs', include: '**/*.so')

в

from fileTree(dir: 'src/main/libs', include: '**/*.so') 

Без этого изменения файлы .so не были найдены, поэтому задача их упаковки никогда не запускалась.

Ответ 11

Ответ от @plaisthos разбился на последнюю версию gradle, но есть еще способ сделать это. Создайте каталог native-libs в корне каталога вашего проекта и скопируйте все наши библиотеки в этот каталог.

Добавьте следующие строки в build.gradle. Постройте и будьте счастливы.

task copyNativeLibs(type: Copy) {
    from(new File(project(':<your project>').getProjectDir(), 'native-libs')) { include '**/*.so' }
    into new File(buildDir, 'native-libs')
}

tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

clean.dependsOn 'cleanCopyNativeLibs'

Ответ 12

Это код, который я использую для создания с использованием android-ndk из gradle. Для этого добавьте путь каталога ndk в gradle.properties т.е. добавьте ndkdir=/home/user/android-ndk-r9d и поместите все jni файлы в папку native в src/main/, как вы можете видеть из приведенного ниже кода. Он создаст jar с собственными libs, которые вы можете использовать обычно, как в System.loadLibrary("libraryname");

dependencies {
    compile fileTree(dir: "$buildDir/native-libs", include: '*.jar')
}

task ndkBuild(type: Exec) {
    commandLine "$ndkdir/ndk-build", "--directory", "$projectDir/src/main/native", '-j', Runtime.runtime.availableProcessors(),
            "APP_PLATFORM=android-8",
            "APP_BUILD_SCRIPT=$projectDir/src/main/native/Android.mk",
            "NDK_OUT=$buildDir/native/obj",
            "NDK_APP_DST_DIR=$buildDir/native/libs/\$(TARGET_ARCH_ABI)"
}

task nativeLibsToJar(type: Jar, description: 'create a jar with native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    from fileTree(dir: "$buildDir/native/libs", include: '**/*.so')
    into 'lib/'
}

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

nativeLibsToJar.dependsOn 'ndkBuild'

Ответ 13

Я использовал следующий код для компиляции собственных библиотек Dropbox, я использую Android Studio v1.1.

task nativeLibsToJar(type: Zip) {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    extension 'jar'
    from fileTree(dir: 'src/main/libs', include: '**/*.so')
    into 'lib/'
}

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

Ответ 14

Я использовал ndk.dir=/usr/shareData/android-ndk-r11b//путь ndk

в файле local.properties в проекте студии Android. а также добавьте эту строку:
android.useDeprecatedNdk=true

в файле gradle.properties в проекте студии android.

Дополнительная информация здесь: http://tools.android.com/tech-docs/android-ndk-preview

Ответ 15

Чтобы расширить то, что сказал Наксос (спасибо Naxos за отправку меня в правильном направлении!), я немного узнал из недавно выпущенных примеров NDK и отправил ответ в подобном вопросе здесь.

Как настроить NDK с плагином Android Gradle 0.7

В этом сообщении содержатся подробные сведения о связывании встроенных библиотек в вашем приложении для различных архитектур, а также информация о том, как добавить поддержку NDK непосредственно в build.gradle script. По большей части вам больше не нужно делать работу с zip и копией.

Ответ 16

настроить проект в студии android из eclipse: вам нужно импортировать проект eclipse ndk в студию Android без экспорта на gradle, и он работает, также вам нужно добавить путь ndk в local.properties, если отображается ошибка, а затем добавить

sourceSets.main {
        jniLibs.srcDir 'src/main/libs' 
        jni.srcDirs = [] //disable automatic ndk-build callenter code here
    }

в файле build.gradle, затем создайте jni-папку и файл, используя терминал, и запустите его.

Ответ 17

Вот шаги, которые я использовал, чтобы заставить NDK работать в моем проекте Android Studio. Я использовал этот учебник, чтобы помочь мне https://software.intel.com/en-us/videos/using-the-ndk-with-android-studio

Чтобы использовать NDK, вы должны добавить строку NDK в local.properties. Итак, под вашим sdk.dir добавьте

ndk.dir=C\:\\MyPathToMyNDK\ndk

В моих приложениях build.gradle у меня есть следующий код

        ndk {
            moduleName "myLib"
            ldLibs "log"
            stl "gnustl_shared"
            cFlags "-std=c++11 -frtti -fexceptions -pthread"
        }

moduleName - это имя, которое вы хотите дать своему родному коду. Я считаю, что это то, что будет вызываться общей библиотекой. ldLibs позволяет мне регистрироваться в LogCat, stl - это stl, который вы хотите импортировать. Есть много вариантов, таких же, как Eclipse NDK. (http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html)

cFlags для меня все еще есть определенное количество черной магии. Я не нашел хорошего источника для всех вариантов и того, что они мне дают. Найдите вокруг StackOverflow все, что вам нужно, вот где я его нашел. Я знаю, что С++ 11 позволяет мне использовать новый стандарт С++ 11.

Вот пример того, как я записываю LogCat из собственного кода

__android_log_print(ANDROID_LOG_DEBUG, "TestApp", "Adding - String %d has a field name of %s and a value of %s", i, lKeyUTF8.c_str(), lValueUTF8.c_str());

Ответ 18

Теперь, когда Android Studio находится в стабильном канале, довольно просто получить android-ndk samples. Эти образцы используют ndk экспериментальный плагин и новее, чем те, которые связаны с онлайн-документацией Android NDK. Как только вы знаете, что они работают, вы можете изучить файлы build.gradle, local.properties и gradle -wrapper.properties и соответственно изменить свой проект. Ниже приведены шаги, чтобы заставить их работать.

  • Перейдите к настройкам, внешнему виду и поведению, системным настройкам, Android SDK, выберите вкладку SDK Tools и установите Android NDK версии 1.0.0 в нижней части списка. Это загрузит NDK.

  • Укажите местоположение недавно загруженного NDK. Обратите внимание, что он будет помещен в каталог sdk/ndk-bundle. Сделайте это, выбрав "Файл", "Структура проекта", "Расположение SDK" (слева) и укажите путь в Android NDK. Это добавит запись ndk в local.properties, подобную этому:

    Mac/Linux: ndk.dir =/Android/sdk/ndk-bundle
    Windows: ndk.dir = C:\Android\sdk\ndk-bundle

Я успешно создал и развернул все проекты в репозитории таким образом, за исключением gles3gni, native-codec и builder. Я использую следующее:

Android Studio 1.3 build AI-141.2117773
Образцы android-ndk, опубликованные 28 июля 2015 г. (ссылка выше)
SDK Tools 24.3.3
NDK r10e извлечен в C:\Android\sdk\ndk-bundle
Gradle 2,5
Gradle плагин 0.2.0
Windows 8.1 64 бит

Ответ 19

NDK Builds и gradle (базовый)

Как правило, создание с помощью NDK так же просто, как правильное указание пути ndkBuild к Android.mk или пути cmake к CMakeLists.txt. Я рекомендую CMake над старым Android.mk, потому что поддержка Android Studio C/С++ основана на CLion и использует CMake в качестве формата проекта. Это по моему опыту, как правило, делает IDE более восприимчивым к более крупным проектам. Все, скомпилированные в вашем проекте, будут автоматически созданы и скопированы в APK.

apply plugin: 'com.android.library'

android {
    compileSdkVersion 19
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 19

        ndk {
            abiFilters 'armeabi', 'armeabi-v7a', 'x86'
            // 64-bit support requires an Android API level higher than 19; Namely 21 and higher
            //abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }

        externalNativeBuild {
            cmake {
                arguments '-DANDROID_TOOLCHAIN=clang',
                        '-DANDROID_PLATFORM=android-19',
                        '-DANDROID_STL=gnustl_static',
                        '-DANDROID_ARM_NEON=TRUE'

            }
        }
    }

    externalNativeBuild {
        cmake {
            path 'src/main/jni/CMakeLists.txt'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Добавление готовых библиотек в проект (расширенный)

Статические библиотеки (.a) в вашей сборке NDK будут автоматически включены, но готовые динамические библиотеки (.so) должны быть помещены в jniLibs. Это можно настроить с помощью sourceSets, но вы должны принять стандарт. Вам не нужны дополнительные команды в build.gradle при включении готовых библиотек.

Макет jniLibs

Дополнительную информацию о структуре можно найти в Android gradle Руководство пользователя плагина.

|--app:
|--|--build.gradle
|--|--src:
|--|--|--main
|--|--|--|--java
|--|--|--|--jni
|--|--|--|--|--CMakeLists.txt
|--|--|--|--jniLibs
|--|--|--|--|--armeabi
|--|--|--|--|--|--.so Files
|--|--|--|--|--armeabi-v7a
|--|--|--|--|--|--.so Files
|--|--|--|--|--x86
|--|--|--|--|--|--.so Files

Затем вы можете проверить, что полученный APK содержит ваши .so файлы, обычно под build/outputs/apk/, используя unzip -l myApp.apk для отображения содержимого.

Создание общих библиотек

Если вы создаете общую библиотеку в NDK, вам больше не нужно ничего делать. Он будет правильно установлен в APK.

Ответ 20

Просто добавьте эти строки в приложение build.gradle

dependencies {
    ...
    compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
}

task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    extension 'jar'
    from fileTree(dir: 'libs', include: '**/*.so')
    into 'lib/armeabi/'
}

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

Ответ 21

now.I может загрузить такой успех!

1. присоединить файл .so к этому пути

Project:

| --src | - | --main | - | - | --java | - | - | --jniLibs | - | - | - | --armeabi | - | - | - | - | -. так файлы

2. присоедините этот код к gradle.build

android {
splits {
    abi {
        enable true
        reset()
        include 'x86', 'x86_64', 'arm64-v8a', 'armeabi-v7a', 'armeabi'
        universalApk false
    }
}

}

3. System.loadLibrary("yousoname");

  1. goodluck для вас, это нормально с gradle 1.2.3

Ответ 22

  • Если ваш проект экспортирован из eclipse, добавьте коды ниже в файл gradle:

    android {
       sourceSets{
            main{
               jniLibs.srcDir['libs']  
          }  
        }
    }
    

2.Если вы создаете проект в студии Android:

создайте папку с именем jniLibs в src/main/и поместите ваши файлы *.so в папку jniLibs.

И скопируйте код, как показано ниже в файле gradle:

android {
    sourceSets{  
       main{  
         jniLibs.srcDir['jniLibs']  
      }  
    }
}

Ответ 23

Хотя я считаю, что SJoshi (oracle guy) имеет самый полный ответ, проект SWIG - это особый случай, интересный и полезный, при этом, но не обобщенный для большинства проектов, которые хорошо справились со стандартным SDK ant проекты + NDK. Мы все хотели бы использовать Android-студию сейчас, скорее всего, или хотим создать более удобную для CI конструкцию toolchain для мобильных устройств, которую теоретически предлагает gradle.

Я разместил свой подход, заимствованный где-то (я нашел это на SO, но разместил текст для приложения build.gradle: https://gist.github.com/truedat101/c45ff2b69e91d5c8e9c7962d4b96e841). Вкратце я рекомендую следующее:

  • Не обновляйте проект до последней версии gradle build
  • Используйте com.android.tools.build: gradle:1.5.0 в корневом каталоге проекта
  • Использовать com.android.application в проекте приложения
  • Убедитесь, что gradle.properties имеет: android.useDeprecatedNdk = true (в случае его жалобы)
  • Используйте вышеуказанный подход, чтобы гарантировать, что ваши часы и часы работы, создающие файлы Android.mk, не будут отброшены. Вы контролируете, какие цели арки строить. И эти инструкции относятся к пользователям Windows, которые теоретически могут создавать окна без особых проблем.

Gradle для Android был бесполезным, на мой взгляд, так же, как мне нравятся концептуальные концепции maven и ущемленная структура каталогов для проекта. Эта функция NDK была "скоро" в течение почти 3 лет.