cmd/gomobile: fall back to $ANDROID_NDK_HOME for the NDK path

After trying $ANDROID_HOME/ndk-bundle, we also try $ANDROID_NDK_HOME.

ANDROID_NDK_HOME is advised in this NDK sample code wiki:
https://github.com/googlesamples/android-ndk/wiki
Mentioned in the Bazel buildsystem Android app tutorial:
https://docs.bazel.build/versions/master/tutorial/android-app.html

On Ubuntu, the google-android-ndk-installer leaves the NDK in
/usr/lib/android-ndk, and it seems to be up to the user to set
ANDROID_NDK_HOME.

On Arch Linux, the android-ndk package installs the NDK into /opt/android-ndk
and sets ANDROID_NDK_HOME to there using an /etc/profile.d/file

Fixes golang/go#31461

Change-Id: I9f7f7e24b19e0047419f9725b67bd6daf2b1d328
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/171938
Run-TryBot: Elias Naur <mail@eliasnaur.com>
Reviewed-by: Elias Naur <mail@eliasnaur.com>
diff --git a/cmd/gomobile/env.go b/cmd/gomobile/env.go
index dbf9c8c..c70b2a1 100644
--- a/cmd/gomobile/env.go
+++ b/cmd/gomobile/env.go
@@ -161,16 +161,25 @@
 	if buildN {
 		return "$NDK_PATH", nil
 	}
+
 	androidHome := os.Getenv("ANDROID_HOME")
-	if androidHome == "" {
-		return "", errors.New("The Android SDK was not found. Please set ANDROID_HOME to the root of the Android SDK.")
+	if androidHome != "" {
+		ndkRoot := filepath.Join(androidHome, "ndk-bundle")
+		_, err := os.Stat(ndkRoot)
+		if err == nil {
+			return ndkRoot, nil
+		}
 	}
-	ndkRoot := filepath.Join(androidHome, "ndk-bundle")
-	_, err := os.Stat(ndkRoot)
-	if err != nil {
-		return "", fmt.Errorf("The NDK was not found in $ANDROID_HOME/ndk-bundle (%q). Install the NDK with `sdkmanager 'ndk-bundle'`", ndkRoot)
+
+	ndkRoot := os.Getenv("ANDROID_NDK_HOME")
+	if ndkRoot != "" {
+		_, err := os.Stat(ndkRoot)
+		if err == nil {
+			return ndkRoot, nil
+		}
 	}
-	return ndkRoot, nil
+
+	return "", fmt.Errorf("no Android NDK found in $ANDROID_HOME/ndk-bundle nor in $ANDROID_NDK_HOME")
 }
 
 func envClang(sdkName string) (clang, cflags string, err error) {
diff --git a/cmd/gomobile/env_test.go b/cmd/gomobile/env_test.go
new file mode 100644
index 0000000..c041313
--- /dev/null
+++ b/cmd/gomobile/env_test.go
@@ -0,0 +1,66 @@
+// Copyright 2019 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"testing"
+)
+
+func TestNdkRoot(t *testing.T) {
+	home, err := ioutil.TempDir("", "gomobile-test-")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	homeorig := os.Getenv("ANDROID_HOME")
+	ndkhomeorig := os.Getenv("ANDROID_NDK_HOME")
+	defer func() {
+		os.Setenv("ANDROID_HOME", homeorig)
+		os.Setenv("ANDROID_NDK_HOME", ndkhomeorig)
+		os.RemoveAll(home)
+	}()
+
+	os.Setenv("ANDROID_HOME", home)
+
+	if ndk, err := ndkRoot(); err == nil {
+		t.Errorf("expected error but got %q", ndk)
+	}
+
+	sdkNDK := filepath.Join(home, "ndk-bundle")
+	envNDK := filepath.Join(home, "android-ndk")
+
+	for _, dir := range []string{sdkNDK, envNDK} {
+		if err := os.Mkdir(dir, 0755); err != nil {
+			t.Fatalf("couldn't mkdir %q", dir)
+		}
+	}
+
+	os.Setenv("ANDROID_NDK_HOME", envNDK)
+
+	if ndk, _ := ndkRoot(); ndk != sdkNDK {
+		t.Errorf("got %q want %q", ndk, sdkNDK)
+	}
+
+	os.Unsetenv("ANDROID_HOME")
+
+	if ndk, _ := ndkRoot(); ndk != envNDK {
+		t.Errorf("got %q want %q", ndk, envNDK)
+	}
+
+	os.RemoveAll(envNDK)
+
+	if ndk, err := ndkRoot(); err == nil {
+		t.Errorf("expected error but got %q", ndk)
+	}
+
+	os.Setenv("ANDROID_HOME", home)
+
+	if ndk, _ := ndkRoot(); ndk != sdkNDK {
+		t.Errorf("got %q want %q", ndk, sdkNDK)
+	}
+}