Ошибка: ваш проект содержит файлы С++, но он не использует встроенную встроенную сборку

Ошибка: не удалось выполнить задачу ': app: compileDebugNdk'.

Ошибка: Ваш проект содержит файлы C++, но он не использует поддерживаемую собственную систему сборки. Подумайте об использовании интеграции CMake или ndk-build со стабильным плагином Android Gradle:

Скриншот

Ответы

Ответ 1

Кажется, что у вас уже есть код на С++ и Makefile в каталоге проекта, и в этом случае вам просто нужно связать Gradle с родной библиотекой:

  • В панели проектов щелкните правой кнопкой мыши на своем модуле и выберите Ссылка Проект С++ с Gradle.
  • В раскрывающемся списке выберите CMake или ndk-build, в зависимости от вашего проекта

    а. Если вы выбрали CMake, укажите CMakeLists.txt script в своем проекте

    б. Если вы выбрали ndk-build, укажите Android.mk.

Источник: https://developer.android.com/studio/projects/add-native-code.html#existing-project

Ответ 2

Плагин Android в наши дни показывает лучшее объяснение.

* Что пошло не так:

Ошибка выполнения для задачи: app: compileDebugNdk '.
> Ошибка: ваш проект содержит файлы С++, но он не использует поддерживаемую встроенную систему сборки.
  Рассмотрите возможность использования интеграции CMake или ndk-build. Для получения дополнительной информации перейдите по ссылке:    http://d.android.com/r/studio-ui/add-native-code.html
  Кроме того, вы можете использовать экспериментальный плагин:     https://developer.android.com/studio/build/experimental-plugin.html.

Существует по существу два варианта: либо использовать встроенный внешнийNativeBuild, либо отключить его.

  • Наилучший подход для первого варианта был описанный Janman здесь.

    Я бы не рекомендовал использовать экспериментальный плагин в наши дни, потому что я считаю, что интеграция ndk-build более могущественный. Но простые проекты могут быть проще поддерживать с помощью экспериментального плагина.

  • Кроме того, вы можете по какой-то причине выбрать собственные библиотеки вне Android Studio. Чтобы предотвратить сообщение об ошибке, я знаю три варианта.

Ответ 3

Новое решение добавьте это в свой build.gradle (Модуль: приложение)

externalNativeBuild {
    cmake {
        version "3.12.0"
    }
    ndkBuild {
        path 'src/main/jni/Application.mk'
    }
}

Ответ 4

Просто добавьте android.useDeprecatedNdk=true в gradle.properties файл.

Ответ 5

Я решил эту проблему следующим образом. Прежде всего, не делайте никаких пробелов в каталоге проектов. Затем отредактируйте build.gradle(Module: app) и добавьте такие строки, как я.

 buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
sourceSets { main { jni.srcDirs = ['src/main/jni/','src/main/jniLibs/'] } }
externalNativeBuild {
    ndkBuild {
        path 'build/intermediates/ndk/debug/Android.mk'
    }
}

Ответ 7

  1. Убедитесь, что вы установили зависимости LLDB, CMake и NDK, если нет, выберите SDK TOOLS в Инструменты> Android> SDK Manager, установите соответствующие флажки и примените.
  2. возьмите build.gradle в приложении и найдите

    sourceSets { 
        main { 
            jni.srcDirs = ['src/main/jni', 'src/main/jniLBS/'] 
        } 
    }
    

    и прокомментируйте эту строку.

Ответ 8

  1. Работа над проектом OpenCV в андроид студии 3.3.1. Я столкнулся с той же проблемой и нашел решение, установив CMake, LLDB и NDK в Tools-> SDK Manager → Android SDK-> SDK Tools.
  2. Добавьте следующее в build.gradle (Модуль: приложение)

    externalNativeBuild {
            cmake {
                        version "3.12.0"
            }
            ndkBuild {
                        path 'build/intermediates/ndk/debug/Android.mk'
            }
       }
    }
    

Ответ 9

Очень важно удалить эту строку в build.gradle (Модуль: приложение).

sourceSets {main {jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/']}}

Ответ 10

Вы должны заботиться о своих исходных наборах в gradle (module.app) и посмотреть, как называется ваша папка lib для вашего jni, например, мое имя папки было jniLins, поэтому я должен удалить папку jni из sourceSets, но лучший способ - это поместить массив пустой, чтобы он мог читать из папки exixting, я имею в виду вместо

sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/'] } }

напишите это:

sourceSets { main { jni.srcDirs = [] } }

Ответ 11

Есть несколько мест, где вы можете поместить блок "externalNativeBuild", что означает разные вещи. Он должен находиться как в блоке android {}, так и в блоке android {defaultConfig {}}. Если внешний отсутствует, вы получите это. Рабочий пример отсюда: https://github.com/kennethreitz/super-sphere/blob/master/dist/android/love/build.gradle Блок "ndk" не нужен.

android {
    defaultConfig {
        externalNativeBuild {
            ndkBuild {
                arguments "-j2"
            }
        }
    }

    externalNativeBuild {
        ndkBuild {
            path "src/jni/Android.mk"
        }
    }
}