NDK не настроен. Загрузите его с помощью SDK manager. Предпочтительная версия NDK — ‘21.0.6113669’

#android #gradle #android-ndk #android-gradle-plugin #build.gradle

#Android #gradle #android-ndk #android-gradle-plugin #build.gradle

Вопрос:

Я уже установил версию NDK ‘21.0.6113669’, но все еще пытаюсь синхронизировать проект с файлами Gradle, получая следующую ошибку:

 NDK not configured. Download it with SDK manager. Preferred NDK version is '21.0.6113669'. 
Update NDK version to 21.0.6113669 and sync project
  

введите описание изображения здесь

Пожалуйста, найдите ниже мой build.gradle

 buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.0'
    }
}

plugins {
  id "com.android.application"
}

android {
    compileSdkVersion project.properties.compileSdkVersion.toInteger()
    ndkVersion '21.0.6113669'
        
    dependencies {
        implementation "androidx.annotation:annotation:1.1.0"
        implementation "androidx.viewpager:viewpager:1.0.0"
        implementation "androidx.drawerlayout:drawerlayout:1.1.0"
        implementation project(":terminal-view")
    }

    defaultConfig {
        applicationId "com.termux"
        minSdkVersion project.properties.minSdkVersion.toInteger()
        targetSdkVersion project.properties.targetSdkVersion.toInteger()
        versionCode 101
        versionName "0.101"

        externalNativeBuild {
            ndkBuild {
                cFlags "-std=c11", "-Wall", "-Wextra", "-Werror", "-Os", "-fno-stack-protector", "-Wl,--gc-sections"
            }
        }

        ndk {
            abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
        }

    }

    signingConfigs {
        debug {
            storeFile file('dev_keystore.jks')
            keyAlias 'alias'
            storePassword 'xrj45yWGLbsO7W0v'
            keyPassword 'xrj45yWGLbsO7W0v'
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            signingConfig signingConfigs.debug
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    externalNativeBuild {
        ndkBuild {
            path "src/main/cpp/Android.mk"
        }
    }

    testOptions {
        unitTests {
            includeAndroidResources = true
        }
    }
    buildToolsVersion '27.0.3'
}

dependencies {
    testImplementation 'junit:junit:4.13'
    testImplementation 'org.robolectric:robolectric:4.3.1'
}

task versionName {
  doLast {
    print android.defaultConfig.versionName
  }
}

def downloadBootstrap(String arch, String expectedChecksum, int version) {
    def digest = java.security.MessageDigest.getInstance("SHA-256")

    def localUrl = "src/main/cpp/bootstrap-"   arch   ".zip"
    def file = new File(projectDir, localUrl)
    if (file.exists()) {
        def buffer = new byte[8192]
        def input = new FileInputStream(file)
        while (true) {
            def readBytes = input.read(buffer)
            if (readBytes < 0) break
            digest.update(buffer, 0, readBytes)
        }
        def checksum = new BigInteger(1, digest.digest()).toString(16)
        if (checksum == expectedChecksum) {
            return
        } else {
            logger.quiet("Deleting old local file with wrong hash: "   localUrl)
            file.delete()
        }
    }

    def remoteUrl = "https://bintray.com/termux/bootstrap/download_file?file_path=bootstrap-"   arch   "-v"   version   ".zip"
    logger.quiet("Downloading "   remoteUrl   " ...")

    file.parentFile.mkdirs()
    def out = new BufferedOutputStream(new FileOutputStream(file))

    def connection = new URL(remoteUrl).openConnection()
    connection.setInstanceFollowRedirects(true)
    def digestStream = new java.security.DigestInputStream(connection.inputStream, digest)
    out << digestStream
    out.close()

    def checksum = new BigInteger(1, digest.digest()).toString(16)
    if (checksum != expectedChecksum) {
        file.delete()
        //throw new GradleException("Wrong checksum for "   remoteUrl   ": expected: "   expectedChecksum   ", actual: "   checksum)
        throw new FileNotFoundException("Wrong checksum for "   remoteUrl   ": expected: "   expectedChecksum   ", actual: "   checksum)
    }
}

clean {
    doLast {
        def tree = fileTree(new File(projectDir, 'src/main/cpp'))
        tree.include 'bootstrap-*.zip'
        tree.each { it.delete() }
    }
}

task downloadBootstraps(){
    doLast {
        def version = 30
        downloadBootstrap("aarch64", "7a90034285c614d23fa450547a5e2aec77d4242c9891ad662bf0c6fd3bd7ef4e", version)
        downloadBootstrap("arm",     "f030869ce9a43f84d88560d7ac5153ee4f7e517bca0b37ab01df3e1acba0fe37", version)
        downloadBootstrap("i686",    "1ea9b63f21602231140d58a5545cfbc6bc2ded56ef2b3c31cba2759d913eef00", version)
        downloadBootstrap("x86_64",  "a50eb8a4dd02b7898bbd4a9653a25c14b56c1737409ce7f64110fd33c2c69382", version)
    }
}

//buildscript {
//    dependencies {
//        classpath 'com.android.tools.build:gradle:4.0.0'
//    }
//}

afterEvaluate {
  android.applicationVariants.all { variant ->
    variant.javaCompileProvider.get().dependsOn(downloadBootstraps)
  }
}
  

Я удалил папку .gradle со своего ноутбука и переустановил, а также попробовал опцию Аннулирования кэшей / перезапуска из Android Studio, но проблема по-прежнему остается нерешенной.
Любые предложения будут приветствоваться.

Ответ №1:

это build.gradle в Android каталоге! необходимо добавить

 android {
    ndkVersion '21.3.6528147'
...
  

для build.gradle Android/app установки и удаления ndk version ... из Android / build.gradle

мой простой build.gradle в Android/app коде :

 def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
    compileSdkVersion 30
    ndkVersion '21.0.6113669'
    sourceSets {
        main.java.srcDirs  = 'src/main/kotlin'
    }

    lintOptions {
        disable 'InvalidPackage'
        checkReleaseBuilds false
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.test.test"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
  

Комментарии:

1. Хотя это работает, но у других компьютеров может быть другая NDK версия. Я предпочитаю в файле свойств или лучше всего в переменной среды.

Ответ №2:

Загрузите Ndk с » https://developer.android.com/ndk » и распакуйте его в нужное место, добавьте его путь в файл local.properties следующим образом:

ndk.dir=C: Users AppData android-ndk-r23b

И измените версию ndk в файле build.gradle

android {

 ndkVersion '23.1.7779620'
...
  

Откройте Syc сейчас и создайте свое приложение