{"record":{"id":"799da1879c814bfa","repo":"tauri-apps/tauri","slug":"android-ndk-invalid-make-sure-the-ndk-home-enviro","errorCode":null,"errorMessage":"Android NDK invalid. Make sure the NDK_HOME environment variable has correct value.","messagePattern":"Android NDK invalid\\. Make sure the NDK_HOME environment variable has correct value\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tauri-cli/src/mobile/android/mod.rs","lineNumber":605,"sourceCode":"  }\n\n  Ok(())\n}\n\nfn ensure_ndk(non_interactive: bool) -> Result<()> {\n  // re-evaluate ANDROID_HOME\n  let android_home = std::env::var_os(\"ANDROID_HOME\")\n    .or_else(|| std::env::var_os(\"ANDROID_SDK_ROOT\"))\n    .map(PathBuf::from)\n    .context(\"Failed to locate Android SDK\")?;\n\n  // check NDK_HOME\n  let mut installed_ndks = if let Some(ndk_home) = std::env::var_os(\"NDK_HOME\") {\n    let ndk_path = PathBuf::from(ndk_home);\n    if ndk_path.is_dir() {\n      vec![ndk_path]\n    } else {\n      crate::error::bail!(\n        \"Android NDK invalid. Make sure the NDK_HOME environment variable has correct value.\"\n      );\n    }\n  } else {\n    read_dir(android_home.join(\"ndk\"))\n      .map(|dir| {\n        dir\n          .into_iter()\n          .flat_map(|e| e.ok().map(|e| e.path()))\n          .collect::<Vec<_>>()\n      })\n      .unwrap_or_default()\n  };\n  installed_ndks.sort();\n\n  if let Some(ndk) = installed_ndks.last() {\n    log::info!(\"Using installed NDK: {}\", ndk.display());\n    std::env::set_var(\"NDK_HOME\", ndk);","sourceCodeStart":587,"sourceCodeEnd":623,"githubUrl":"https://github.com/tauri-apps/tauri/blob/52e4b6e71d8632a7e648f866c442e287ecddee34/crates/tauri-cli/src/mobile/android/mod.rs#L587-L623","documentation":"ensure_ndk() found the NDK_HOME environment variable set, but its value is not an existing directory (is_dir() returned false). The CLI refuses to guess and aborts so you can correct the path — typically it points to a wrong location or includes a stale NDK version folder that was removed during an SDK update.","triggerScenarios":"NDK_HOME exported but pointing at a nonexistent path, a file instead of a directory, or $ANDROID_HOME/ndk/<old-version> left over from an NDK upgrade that deleted the folder.","commonSituations":"NDK updated via sdkmanager/Android Studio so the old versioned directory disappeared while the shell/CI env still exports it; typo in the path; trailing quotes or Windows path-style issues in env files.","solutions":["Point NDK_HOME at an existing NDK directory, e.g. `export NDK_HOME=$ANDROID_HOME/ndk/27.0.0` (pick a folder actually listed by `ls $ANDROID_HOME/ndk`)","If no NDK is installed, unset NDK_HOME entirely so the CLI can auto-detect or offer to install one","Restart your shell/CI job after fixing the export so the new value takes effect"],"exampleFix":"# before\nexport NDK_HOME=\"$HOME/Android/Sdk/ndk\"          # or a removed version\n# after\nls \"$HOME/Android/Sdk/ndk\"                       # see installed versions\nexport NDK_HOME=\"$HOME/Android/Sdk/ndk/27.0.0\"   # an existing directory","handlingStrategy":"validation","validationCode":"if [ -n \"$NDK_HOME\" ] && [ ! -d \"$NDK_HOME\" ]; then\n  echo \"NDK_HOME points to a missing directory: $NDK_HOME\"\n  ls \"$ANDROID_HOME/ndk\" 2>/dev/null\n  exit 1\nfi","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set NDK_HOME from the actual directory listing: export NDK_HOME=$(ls -d $ANDROID_HOME/ndk/* | tail -1)","Re-export NDK_HOME after upgrading the NDK (versioned folders change)","Never persist NDK_HOME in committed env files with hard-coded versions that go stale"],"tags":["android","ndk","environment","path","setup"],"backgroundTag":"android-ndk-path-invalid","analyzedSha":"52e4b6e71d8632a7e648f866c442e287ecddee34","analyzedAt":"2026-08-20T13:59:20.734Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}