Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No version of NDK matched the requested version

After updating to Android Gradle plugin 3.6.0 (released Feb 24, 2020), several project independently started failing with:

No version of NDK matched the requested version 20.0.5594570. Versions available locally: 21.0.6113669

It's quite simple to "fix" this locally by installing the older expected ndk version:

sdkmanager 'ndk;20.0.5594570'

However, my question is: Where and how is this older version specified? And how do I update it so it matches the latest version 21.0.6113669?

like image 574
friederbluemle Avatar asked Oct 21 '22 02:10

friederbluemle


People also ask

How do I know if android NDK is installed?

You'll need to point to your NDK in your eclipse by adding the path of ndk-build to Window > preferences > android > NDK. Right click on your project folder. Choose android tools -> add native support (the bottom one) and click finish. Now it will ask for a name for your .

What version of NDK do I have in flutter?

The NDK version 20.0. 5594570 can be install manually by going into android studio -> SDK manager -> SDK tools . Select the show package detail checkbox. You will be able to see all the NDK versions available.

How do I downgrade NDK?

In order to downgrade your ndk, you will have to pull it from the internet with wget and move it into your Android SDK dir: wget https://dl.google.com/android/repository/android-ndk-r13b-darwin-x86_64.zip. unzip android-ndk-r13b-darwin-x86_64.


4 Answers

I have the same issue. I resolved it through the SDK manager under SDK Tools, click Show Package Details and then scroll under NDK (Side by side) and tick and apply the version you need. See image below:

Image link to SDK tools for NDK version install

My question for anyone is, why do we need this now for projects that do not require the NDK? As it turns out the NDK is a pre-existing requirement in the project I work on for a dependency!

like image 100
kelvin Avatar answered Oct 29 '22 02:10

kelvin


The following solutions assume that the machine you are using currently has NDK installed and was previously able to build your project but started failing with the error "No version of NDK matched the requested version" after updating to Android Gradle plugin 3.6.0. Before proceeding make sure to have NDK installed.

Option 1:

You can simply select your locally installed NDK in the Project Structure Dialog

You can open the Project Structure Dialog by clicking File > Project Structure... or by pressing the hotkeys CTRL + ALT + SHIFT + S (on windows)

Once the Project Structure Dialog is open, go to SDK Location and select your locally installed version of NDK under Android NDK Location. Typically this is installed somewhere in your user folder then \AppData\Local\Android\Sdk\ndk\%ndk version% at least for Windows.

Project Structure dialog screenshot - from Android Studio 3.6 Build #AI-192.7142.36.36.6200805, built on February 12, 2020

Option 2:

Doing option 1 will edit your local.properties file for you and will work in most cases. But if you want to use a consistent NDK version on all machines you build the project with, according to this official guide, you can configure it from your module gradle script. Simply add the ndkVersion in your module gradle script's android{} block like so.

android {
    ndkVersion "major.minor.build"
}

replacing the string between the doublequotes with the NDK version you want to use

Option 3:

If you want all projects built on a particular machine to use the same NDK version, you can also set ANDROID_NDK_HOME environment variable with the path to the NDK folder.

like image 158
Subaru Tashiro Avatar answered Oct 29 '22 01:10

Subaru Tashiro


It isn't necessary with Android gradle plugin > 4.1.0 (see also https://issuetracker.google.com/issues/144111441)

With < 4.1.0 I run into this too

No version of NDK matched the requested version 20.0.5594570. Versions available locally: 21.0.6113669

Option 1:

You can simply select your locally installed NDK in the Project Structure Dialog works ! enter image description here

But is only valid for local builds, an I need a solution for CI

Option 2:

It's only works, when you specify it in every used module

android {
    compileSdkVersion 28
    ndkVersion "21.0.6113669"
    ...
}

Here it seems not to work https://github.com/hannesa2/panoramagl/pull/17/checks with this change https://github.com/hannesa2/panoramagl/pull/17/files#diff-cff4e8c294a5dc5e76308662ae1ddcacR6-R7

Option 3:

export ANDROID_NDK_HOME=/Users/{my-user}/Development/adt/sdk/ndk/21.0.6113669

works too !

like image 73
hannes ach Avatar answered Oct 29 '22 02:10

hannes ach


To answer the part of your question not answered by others, "Where and how is this older version specified? And how do I update it so it matches the latest version 21.0.6113669?":

The default version is set by the Android Gradle plugin. Each version will default to whatever version of the NDK that we used during testing to guarantee the best possible compatibility.

The difference between this and earlier plugin versions is that it used to happily use any NDK that you happened to have installed. This caused a ton of "works on my machine" issues for users where their co-workers couldn't build the project, it wouldn't work on CI but would locally, etc. It wasn't a good situation.

You can pick a specific version of the NDK to use in your project by setting android.ndkVersion in your build.gradle. if you don't, it'll try to use the default version for the Gradle plugin that you're using.

The annoying bit is that most versions (until 4.1) will not automatically download the default version, which gives you the error you're seeing. If you explicitly pick a version in your build.gradle it actually will download automatically, and with 4.1 it will automatically download the default version too.

A thing that often confuses people is why this hits them when they're not using the NDK, or at least believe they are not. The answer in that case is that one of your dependencies includes native libraries and these need to be stripped before they are packed into the APK to keep size down, and strip comes from the NDK.

like image 22
Dan Albert Avatar answered Oct 29 '22 01:10

Dan Albert