diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs index 549267e..9ee716f 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs @@ -135,7 +135,19 @@ IEnumerable ToJdkInfos (IEnumerable paths, string locator) return ToJdkInfos (GetPreferredJdkPaths (), "Preferred Registry") .Concat (ToJdkInfos (GetOpenJdkPaths (), "OpenJDK")) .Concat (ToJdkInfos (GetKnownOpenJdkPaths (), "Well-known OpenJDK paths")) - .Concat (ToJdkInfos (GetOracleJdkPaths (), "Oracle JDK")); + .Concat (ToJdkInfos (GetOracleJdkPaths (), "Oracle JDK")) + .Concat (ToJdkInfos (GetEnvironmentJdkPaths (), "Environment Variables")); + } + + private static IEnumerable GetEnvironmentJdkPaths () + { + var environment = new [] { "JAVA_HOME" }; + foreach (var key in environment) { + var value = Environment.GetEnvironmentVariable (key); + if (!string.IsNullOrEmpty (value)) { + yield return value; + } + } } private static IEnumerable GetPreferredJdkPaths () diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Tests/AndroidSdkInfoTests.cs b/src/Xamarin.Android.Tools.AndroidSdk/Tests/AndroidSdkInfoTests.cs index ff69f54..50c6d9a 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Tests/AndroidSdkInfoTests.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Tests/AndroidSdkInfoTests.cs @@ -135,6 +135,35 @@ public void Constructor_SetValuesFromPath () } } + [Test] + [Ignore ("This test will only work locally if you rename/remove your Open JDK directory.")] + public void JdkDirectory_JavaHome () + { + CreateSdks (out string root, out string jdk, out string ndk, out string sdk); + JdkInfoTests.CreateFauxJdk (jdk, releaseVersion: "1.8.999", releaseBuildNumber: "9", javaVersion: "1.8.999-9"); + + var logs = new StringWriter (); + Action logger = (level, message) => { + logs.WriteLine ($"[{level}] {message}"); + }; + + string java_home = null; + try { + // We only set via JAVA_HOME + java_home = Environment.GetEnvironmentVariable ("JAVA_HOME", EnvironmentVariableTarget.Process); + Environment.SetEnvironmentVariable ("JAVA_HOME", jdk); + var info = new AndroidSdkInfo (logger, androidSdkPath: sdk, androidNdkPath: ndk, javaSdkPath: ""); + + Assert.AreEqual (ndk, info.AndroidNdkPath, "AndroidNdkPath not preserved!"); + Assert.AreEqual (sdk, info.AndroidSdkPath, "AndroidSdkPath not preserved!"); + Assert.AreEqual (jdk, info.JavaSdkPath, "JavaSdkPath not preserved!"); + } finally { + if (java_home != null) + Environment.SetEnvironmentVariable ("JAVA_HOME", java_home, EnvironmentVariableTarget.Process); + Directory.Delete (root, recursive: true); + } + } + static bool IsWindows => OS.IsWindows; static void CreateSdks (out string root, out string jdk, out string ndk, out string sdk)