diff --git a/Configuration.props b/Configuration.props
index c6f829d80d2..b5db11046a1 100644
--- a/Configuration.props
+++ b/Configuration.props
@@ -137,11 +137,11 @@
L_18.1.6-8.0.0-1
5394EA6C411DA3A08BF0E6A87E1DD1B98BD2562B896C0CACD18E29E2FD4C0660
- 21.0.8
- jdk-21
- jdk-21.0.8+9
+ 25.0.4.1
+ jdk-25
+ jdk-25.0.4.1+1
$(MicrosoftOpenJDKVersion)
- 17.0
+ 21.0
$(AndroidToolchainDirectory)\$(MicrosoftOpenJDKFolder)
<_JdkExeExtension Condition=" '$(_JdkExeExtension)' == '' And '$(HostOS)' == 'Windows' ">.exe
$(JavaSdkDirectory)\bin\java$(_JdkExeExtension)
diff --git a/build-tools/automation/azure-pipelines-internal.yaml b/build-tools/automation/azure-pipelines-internal.yaml
index 257c8faecdd..6f095d74024 100644
--- a/build-tools/automation/azure-pipelines-internal.yaml
+++ b/build-tools/automation/azure-pipelines-internal.yaml
@@ -65,7 +65,7 @@ variables:
value: 'false'
# Override for internal pipeline
- name: DefaultJavaSdkMajorVersion
- value: 21
+ value: 25
# Override pool images for internal (non-"-open") dnceng agents.
# Confirm these pool/image names exist in the dnceng/internal project.
# Match the public pipeline's Mac image (Apple Silicon). Using the x64
diff --git a/build-tools/automation/azure-pipelines-public.yaml b/build-tools/automation/azure-pipelines-public.yaml
index 44eae1ceb96..d8004eaad3d 100644
--- a/build-tools/automation/azure-pipelines-public.yaml
+++ b/build-tools/automation/azure-pipelines-public.yaml
@@ -46,7 +46,7 @@ variables:
- template: /build-tools/automation/yaml-templates/variables.yaml@self
# Override for public pipeline
- name: DefaultJavaSdkMajorVersion
- value: 21
+ value: 25
# Override pool images for public Microsoft-hosted agents
- name: LinuxPoolImage
value: ubuntu-22.04
diff --git a/build-tools/automation/yaml-templates/setup-jdk-variables.yaml b/build-tools/automation/yaml-templates/setup-jdk-variables.yaml
index adb99c5fa02..667056f7d24 100644
--- a/build-tools/automation/yaml-templates/setup-jdk-variables.yaml
+++ b/build-tools/automation/yaml-templates/setup-jdk-variables.yaml
@@ -1,5 +1,5 @@
parameters:
- jdkMajorVersion: $(DefaultJavaSdkMajorVersion) # Generally 11|17|21
+ jdkMajorVersion: $(DefaultJavaSdkMajorVersion) # Supported: 21|25
useAgentJdkPath: true # true to use preinstalled agent JDK, false to use 'android-toolchain/jdk-NN'
steps:
diff --git a/build-tools/automation/yaml-templates/variables.yaml b/build-tools/automation/yaml-templates/variables.yaml
index f6ea506729f..54da62e8dad 100644
--- a/build-tools/automation/yaml-templates/variables.yaml
+++ b/build-tools/automation/yaml-templates/variables.yaml
@@ -61,9 +61,9 @@ variables:
- name: DefaultTestSdkPlatforms # Comma-separated SDK Platform(s) to install on test agents (no spaces)
value: 35,36,36.1,37.0,37.1
- name: DefaultJavaSdkMajorVersion
- value: 17
-- name: LatestJavaSdkMajorVersion
value: 21
+- name: LatestJavaSdkMajorVersion
+ value: 25
- name: ExcludedNightlyNUnitCategories
value: 'cat != SystemApplication & cat != TimeZoneInfo & cat != Localization'
- name: RunMAUITestJob
diff --git a/eng/gradle/mirror-dependencies.ps1 b/eng/gradle/mirror-dependencies.ps1
index c28bb0e20a0..a1a0f303df8 100644
--- a/eng/gradle/mirror-dependencies.ps1
+++ b/eng/gradle/mirror-dependencies.ps1
@@ -65,8 +65,7 @@
.EXAMPLE
pwsh ./eng/gradle/mirror-dependencies.ps1 `
-ProjectDir external/Java.Interop/tests/Xamarin.Android.Tools.Bytecode-Tests/kotlin-gradle `
- -Task classes `
- -GradleWrapper external/Java.Interop/build-tools/gradle/gradlew.bat
+ -Task classes
.EXAMPLE
pwsh ./eng/gradle/mirror-dependencies.ps1 `
diff --git a/external/Java.Interop/Directory.Build.props b/external/Java.Interop/Directory.Build.props
index aeb0b70dc64..cc9749a6adc 100644
--- a/external/Java.Interop/Directory.Build.props
+++ b/external/Java.Interop/Directory.Build.props
@@ -58,7 +58,7 @@
dotnet
cmake
- $(MSBuildThisFileDirectory)build-tools\gradle
+ $(MSBuildThisFileDirectory)..\..\build-tools\gradle
$(GradleHome)\gradlew
--stacktrace --no-daemon
11
diff --git a/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.jar b/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 87b738cbd05..00000000000
Binary files a/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.properties b/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index d6e308a6378..00000000000
--- a/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
diff --git a/external/Java.Interop/build-tools/gradle/gradlew b/external/Java.Interop/build-tools/gradle/gradlew
deleted file mode 100755
index af6708ff229..00000000000
--- a/external/Java.Interop/build-tools/gradle/gradlew
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/env sh
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m"'
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn () {
- echo "$*"
-}
-
-die () {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=$(save "$@")
-
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
- cd "$(dirname "$0")"
-fi
-
-exec "$JAVACMD" "$@"
diff --git a/external/Java.Interop/build-tools/gradle/gradlew.bat b/external/Java.Interop/build-tools/gradle/gradlew.bat
deleted file mode 100644
index 6d57edc706c..00000000000
--- a/external/Java.Interop/build-tools/gradle/gradlew.bat
+++ /dev/null
@@ -1,84 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/external/Java.Interop/tools/java-source-utils/build.gradle b/external/Java.Interop/tools/java-source-utils/build.gradle
index ad1639e10e7..fee3b930602 100644
--- a/external/Java.Interop/tools/java-source-utils/build.gradle
+++ b/external/Java.Interop/tools/java-source-utils/build.gradle
@@ -33,7 +33,7 @@ dependencies {
application {
// Define the main class for the application.
- mainClassName = 'com.microsoft.android.App'
+ mainClass = 'com.microsoft.android.App'
}
jar {
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidApkSigner.cs b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidApkSigner.cs
index 6c3000d4986..91c03ba6e86 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidApkSigner.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidApkSigner.cs
@@ -73,6 +73,11 @@ protected override string GenerateCommandLineCommands ()
{
var cmd = new CommandLineBuilder ();
+ var javaOptions = GetJavaOptions (JavaOptions, JdkVersion);
+ if (!javaOptions.IsNullOrEmpty ()) {
+ cmd.AppendSwitch (javaOptions);
+ }
+
var manifest = AndroidAppManifest.Load (ManifestFile.ItemSpec, MonoAndroidHelper.SupportedVersions);
int? minSdk = MonoAndroidHelper.SupportedVersions.MinStableVersion?.ApiLevel;
int? maxSdk = MonoAndroidHelper.SupportedVersions.MaxStableVersion?.ApiLevel;
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/BundleTool.cs b/src/Xamarin.Android.Build.Tasks/Tasks/BundleTool.cs
index a06dfe9f692..a425ce157f7 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/BundleTool.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/BundleTool.cs
@@ -19,8 +19,9 @@ internal virtual CommandLineBuilder GetCommandLineBuilder ()
{
var cmd = new CommandLineBuilder ();
- if (!JavaOptions.IsNullOrEmpty ()) {
- cmd.AppendSwitch (JavaOptions);
+ var javaOptions = GetJavaOptions (JavaOptions, JdkVersion);
+ if (!javaOptions.IsNullOrEmpty ()) {
+ cmd.AppendSwitch (javaOptions);
}
cmd.AppendSwitchIfNotNull ("-Xmx", JavaMaximumHeapSize);
cmd.AppendSwitchIfNotNull ("-jar ", JarPath);
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs
index 6c6f7d87d16..fba0547165f 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs
@@ -83,6 +83,8 @@ at com.android.dx.command.Main.main(Main.java:106)
public string? JavaMaximumHeapSize { get; set; }
+ public string? JdkVersion { get; set; }
+
public virtual string DefaultErrorCode => "JAVA0000";
public string? AssemblyIdentityMapFile { get; set; }
@@ -123,6 +125,26 @@ protected override string GenerateFullPathToTool ()
return Path.Combine (ToolPath, ToolExe);
}
+ internal static string GetJavaOptions (string? javaOptions, string? jdkVersion)
+ {
+ string options = javaOptions ?? "";
+ if (!Version.TryParse (jdkVersion, out var version) || version.Major < 24) {
+ return options;
+ }
+
+ options = AppendJavaOption (options, "--enable-native-access=ALL-UNNAMED");
+ return AppendJavaOption (options, "--sun-misc-unsafe-memory-access=allow");
+ }
+
+ static string AppendJavaOption (string options, string option)
+ {
+ if (options.IndexOf (option, StringComparison.Ordinal) >= 0) {
+ return options;
+ }
+
+ return options.IsNullOrWhiteSpace () ? option : $"{options} {option}";
+ }
+
protected bool LogFromException (string exception, string error) {
switch (exception) {
case "java.lang.OutOfMemoryError":
@@ -231,4 +253,3 @@ protected override void LogEventsFromTextOutput (string singleLine, MessageImpor
}
}
}
-
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs
index 4dfbfa17629..f01c6edb6d1 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs
@@ -29,8 +29,6 @@ public class Javac : JavaCompileToolTask
public string? JavacTargetVersion { get; set; }
public string? JavacSourceVersion { get; set; }
- public string? JdkVersion { get; set; }
-
public override string DefaultErrorCode => "JAVAC0000";
public override bool RunTask ()
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs
index 38f3a1e6f31..3c098ee6016 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs
@@ -62,6 +62,8 @@ public class Lint : AndroidToolTask
[Required]
public string JavaSdkPath { get; set; } = "";
+ public string? JdkVersion { get; set; }
+
///
/// Location of an xml config files used to
/// determine whether issues are enabled or disabled
@@ -194,7 +196,8 @@ public override bool RunTask ()
bool fromCmdlineTools = ToolPath.IndexOf ("cmdline-tools", StringComparison.OrdinalIgnoreCase) >= 0;
- Version lintToolVersion = GetLintVersion (GenerateFullPathToTool ());
+ var environmentVariables = GetJavaEnvironmentVariables ();
+ Version lintToolVersion = GetLintVersion (GenerateFullPathToTool (), environmentVariables);
Log.LogDebugMessage (" LintVersion: {0}", lintToolVersion);
foreach (var issue in DisabledIssuesByVersion) {
if (fromCmdlineTools || lintToolVersion >= issue.Value) {
@@ -210,7 +213,7 @@ public override bool RunTask ()
}
}
- EnvironmentVariables = new [] { "JAVA_HOME=" + JavaSdkPath };
+ EnvironmentVariables = environmentVariables.Select (variable => $"{variable.Key}={variable.Value}").ToArray ();
base.RunTask ();
@@ -348,7 +351,19 @@ XDocument MergeConfigFiles()
return config;
}
- Version GetLintVersion (string tool)
+ Dictionary GetJavaEnvironmentVariables ()
+ {
+ var environmentVariables = new Dictionary {
+ { "JAVA_HOME", JavaSdkPath },
+ };
+ var javaOptions = JavaToolTask.GetJavaOptions (Environment.GetEnvironmentVariable ("JAVA_OPTS"), JdkVersion);
+ if (!javaOptions.IsNullOrEmpty ()) {
+ environmentVariables.Add ("JAVA_OPTS", javaOptions);
+ }
+ return environmentVariables;
+ }
+
+ Version GetLintVersion (string tool, Dictionary environmentVariables)
{
var sb = new StringBuilder ();
var result = MonoAndroidHelper.RunProcess (tool, "--version", (s, e) => {
@@ -357,10 +372,7 @@ Version GetLintVersion (string tool)
}, (s, e) => {
if (!e.Data.IsNullOrEmpty ())
sb.AppendLine (e.Data);
- },
- new Dictionary {
- { "JAVA_HOME", JavaSdkPath }
- });
+ }, environmentVariables);
var versionInfo = sb.ToString ();
if (result != 0 || versionInfo.Contains ("unknown")) {
// lets try to parse the lint-xx-x-x-dev.jar filename to get the version
@@ -391,4 +403,3 @@ Version GetLintVersion (string tool)
}
}
}
-
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/JavaToolTaskTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/JavaToolTaskTests.cs
new file mode 100644
index 00000000000..c0a121c5302
--- /dev/null
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/JavaToolTaskTests.cs
@@ -0,0 +1,19 @@
+using NUnit.Framework;
+using Xamarin.Android.Tasks;
+
+namespace Xamarin.Android.Build.Tests
+{
+ [TestFixture]
+ public class JavaToolTaskTests
+ {
+ [TestCase (null, null, "")]
+ [TestCase ("-Dfoo=bar", "21.0.8", "-Dfoo=bar")]
+ [TestCase (null, "25.0.4.1", "--enable-native-access=ALL-UNNAMED --sun-misc-unsafe-memory-access=allow")]
+ [TestCase ("-Dfoo=bar", "25.0.4.1", "-Dfoo=bar --enable-native-access=ALL-UNNAMED --sun-misc-unsafe-memory-access=allow")]
+ [TestCase ("--enable-native-access=ALL-UNNAMED", "25.0.4.1", "--enable-native-access=ALL-UNNAMED --sun-misc-unsafe-memory-access=allow")]
+ public void GetJavaOptions (string? javaOptions, string? jdkVersion, string expected)
+ {
+ Assert.AreEqual (expected, JavaToolTask.GetJavaOptions (javaOptions, jdkVersion));
+ }
+ }
+}
diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in
index 99ac3069920..69af6b074ae 100644
--- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in
+++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in
@@ -17,7 +17,7 @@
false
true
true
- 21.0.99
+ 25.0.99
{abi}{versionCode:D5}
UpdateGeneratedFiles
True
diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
index 869750074d9..d9b33db97b8 100644
--- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
+++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
@@ -905,6 +905,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(LintToolPath)"
ToolExe="$(LintToolExe)"
JavaSdkPath="$(_JavaSdkDirectory)"
+ JdkVersion="$(_JdkVersion)"
/>
@@ -2369,6 +2370,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(JavaToolPath)"
JavaMaximumHeapSize="$(JavaMaximumHeapSize)"
JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
JarPath="$(AndroidBundleToolJarPath)"
BaseZip="$(_BaseZipIntermediate)"
Modules="@(AndroidAppBundleModules)"
@@ -2485,6 +2487,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(JavaToolPath)"
JavaMaximumHeapSize="$(JavaMaximumHeapSize)"
JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
JarPath="$(AndroidBundleToolJarPath)"
BaseZip="$(_BaseZipIntermediate)"
Modules="@(AndroidAppBundleModules)"
@@ -2685,6 +2688,8 @@ because xbuild doesn't support framework reference assemblies.
ToolExe="$(JavaToolExe)"
ManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml"
AdditionalArguments="$(AndroidApkSignerAdditionalArguments)"
+ JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
/>
@@ -2732,6 +2737,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(JavaToolPath)"
JavaMaximumHeapSize="$(JavaMaximumHeapSize)"
JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
JarPath="$(AndroidBundleToolJarPath)"
AdbToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
@@ -2953,6 +2959,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(JavaToolPath)"
JavaMaximumHeapSize="$(JavaMaximumHeapSize)"
JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
JarPath="$(AndroidBundleToolJarPath)"
AdbToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
@@ -2996,6 +3003,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(JavaToolPath)"
JavaMaximumHeapSize="$(JavaMaximumHeapSize)"
JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
JarPath="$(AndroidBundleToolJarPath)"
AdbToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
diff --git a/src/openjdk/openjdk.targets b/src/openjdk/openjdk.targets
index b25c26a1934..a27c19d78a3 100644
--- a/src/openjdk/openjdk.targets
+++ b/src/openjdk/openjdk.targets
@@ -30,8 +30,8 @@
<_OpenJDKInstallDir>$(AndroidToolchainDirectory)\$(MicrosoftOpenJDKFolder)
<_OpenJDKVersionFile>$(_OpenJDKInstallDir)\xa_jdk_version.txt
+ Windows/Linux archives have: jdk-25.0.4.1+1/bin/java (1 level)
+ macOS archives have: ./jdk-25.0.4.1+1/Contents/Home/bin/java (4 levels, ./ counts) -->
<_OpenJDKStripComponents Condition=" '$(HostOS)' != 'Darwin' ">1
<_OpenJDKStripComponents Condition=" '$(HostOS)' == 'Darwin' ">4
@@ -40,7 +40,7 @@
Inputs="$(MSBuildThisFileFullPath);$(MSBuildProjectFullPath);..\..\Configuration.props"
Outputs="$(_OpenJDKArchive)">
+ File format: "6ecfa864... microsoft-jdk-25.0.4.1-windows-x64.zip" -->
<_DownloadFile Include="$(_OpenJDKHashFileName)">
_DownloadUrl=$(_OpenJDKHashUrl);_DownloadFolder=$(AndroidToolchainCacheDirectory);_DownloadFileName=$(_OpenJDKHashFileName)