Skip to content
This repository was archived by the owner on Jul 6, 2026. It is now read-only.

Commit 64c2719

Browse files
committed
[build] Support building with JetBrains OpenJDK 11 (#629)
Context: https://issuetracker.google.com/issues/150189789 Context: dotnet/android#4562 Context: dotnet/android#4567 Bumps to xamarin/xamarin-android-tools/master@36d7fee5 Changes: dotnet/android-tools@bfb66f3...36d7fee * dotnet/android-tools@36d7fee: JetBrains OpenJDK 11 detection (#82) * dotnet/android-tools@12f52ac: Merge pull request #80 from jonpryor/jonp-drop-net461 * dotnet/android-tools@c7090d0: [Xamarin.Android.Tools.AndroidSdk] Remove net461 JDK 9 -- released 2017-July-27 -- introduced many new features, but broke various Android SDK toolchain programs in various inscrutable ways, so the Android community has been "stuck" on JDK 8 ever since. …until now? A preview version of `apksigner` in the Build-tools 30rc1 package states that it requires Java 9 in order to run, which means we must explore what is required to build under JDK > 8. [JetBrains has an OpenJDK 11.0.4 release for macOS][0], which has a "weird" directory structure but is otherwise workable, so… Will It Build™? $ curl -o jbrsdk-11_0_4-osx-x64-b546.1.tar.gz https://bintray.com/jetbrains/intellij-jdk/download_file?file_path=jbrsdk-11_0_4-osx-x64-b546.1.tar.gz # Above doesn't *actually* work; use a browser to appease Akamai $ tar xzf jbrsdk-11_0_4-osx-x64-b546.1.tar.gz $ export JAVA_HOME=`pwd`/jbrsdk/Contents/Home $ make prepare JI_MAX_JDK=12 $ make all Yes, it builds, but that's *misleading*: it's not actually using `$JAVA_HOME`! …/Java.Interop/build-tools/scripts/jdk.targets(5,5): warning : Not a valid JDK directory: `…/Java.Interop/jbrsdk/Contents/Home`; via locator: $JAVA_HOME System.ArgumentException: Could not find required file `jvm` within `…/Java.Interop/jbrsdk/Contents/Home`; is this a valid JDK? Parameter name: homePath at Xamarin.Android.Tools.JdkInfo.ValidateFile (System.String name, System.String path) at Xamarin.Android.Tools.JdkInfo..ctor (System.String homePath) This is fixed via dotnet/android-tools@36d7fee. Bump xamarin-android-tools, and `make prepare` still works. `make all` fails: $ make all … "…/Java.Interop/jbrsdk/Contents/Home/bin/javac" -parameters -source 1.6 -target 1.6 -bootclasspath "…/Java.Interop/jbrsdk/Contents/Home/bin/../jre/lib/rt.jar" -g -d "obj/Debug/classes" java/android/annotation/NonNull.java java/android/annotation/NonNull.java java/com/xamarin/IJavaInterface.java java/com/xamarin/IParameterInterface.java java/com/xamarin/JavaAnnotation.java java/com/xamarin/JavaType.java java/com/xamarin/NestedInterface.java java/com/xamarin/NotNullClass.java java/com/xamarin/ParameterAbstractClass.java java/com/xamarin/ParameterClass.java java/com/xamarin/ParameterClass2.java java/java/util/Collection.java java/NonGenericGlobalType.java EXEC : warning : [options] source value 6 is obsolete and will be removed in a future release EXEC : warning : [options] target value 1.6 is obsolete and will be removed in a future release EXEC : warning : -parameters is not supported for target value 1.6. Use 1.8 or later. EXEC : warning : [options] To suppress warnings about obsolete options, use -Xlint:-options. 4 warnings EXEC : Fatal error : Unable to find package java.lang in classpath or bootclasspath The problem is that JetBrains' OpenJDK 11 no longer contains a `…/jre/lib/rt.jar` file, so the `-bootclasspath` value is now wrong. Additionally, if you don't use `javac -target`, which implicitly targets JDK 11, `javac` doesn't like that: EXEC : error : option --boot-class-path not allowed with target 11 The solution? Don't Do That™; if `javac` from OpenJDK 11 doesn't want `-bootclasspath`, don't provide it. Update the `<JdkInfo/>` task to check for the existence of the `…/jre/lib/rt.jar` file; if it exists, set `$(JreRtJarPath)`, otherwise the `$(JreRtJarPath)` MSBuild property is empty. Then update `$(_JavacSourceOptions)` so that it *doesn't* provide `-bootclasspath` when `$(JreRtJarPath)` is empty. These three changes -- xamarin-android-tools bump, `<JdkInfo/>` update, and `$(_JavacSourceOptions)` update -- allow `make all` to build successfully. Then we hit *unit* tests. The above `javac` invocation has a warning: EXEC : warning : -parameters is not supported for target value 1.6. Use 1.8 or later. Even though we've been using `javac -target 1.6 -parameters` for *ages*, this combination is no longer supported. In order to use `javac -parameters` now, we need to use `javac -target 1.8`. Update `$(JavacSourceVersion)` to 1.8 so that we can continue using `javac -parameters`, which in turn requires that we update `tests/Xamarin.Android.Tools.Bytecode-Tests` so that we expect the newly updated `.class` file MajorVersion values. [0]: https://bintray.com/jetbrains/intellij-jdk/download_file?file_path=jbrsdk-11_0_4-osx-x64-b546.1.tar.gz
1 parent 5a21381 commit 64c2719

13 files changed

Lines changed: 36 additions & 24 deletions

File tree

‎Directory.Build.props‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@
4343
<XamarinAndroidToolsDirectoryCondition=" '$(XamarinAndroidToolsDirectory)' == '' ">$(MSBuildThisFileDirectory)external\xamarin-android-tools</XamarinAndroidToolsDirectory>
4444
</PropertyGroup>
4545
<PropertyGroup>
46-
<JavacSourceVersionCondition=" '$(JavacSourceVersion)' == '' ">1.6</JavacSourceVersion>
47-
<JavacTargetVersionCondition=" '$(JavacTargetVersion)' == '' ">1.6</JavacTargetVersion>
48-
<JreRtJarPathCondition=" '$(JreRtJarPath)' == '' And '$(JavaCPath)' != '' ">$([System.IO.Path]::GetDirectoryName('$(JavaCPath)'))\..\jre\lib\rt.jar</JreRtJarPath>
49-
<_JavacSourceOptions>-source $(JavacSourceVersion) -target $(JavacTargetVersion) -bootclasspath "$(JreRtJarPath)"</_JavacSourceOptions>
46+
<JavacSourceVersionCondition=" '$(JavacSourceVersion)' == '' ">1.8</JavacSourceVersion>
47+
<JavacTargetVersionCondition=" '$(JavacTargetVersion)' == '' ">1.8</JavacTargetVersion>
48+
<_BootClassPathCondition=" '$(JreRtJarPath)' != '' ">-bootclasspath "$(JreRtJarPath)"</_BootClassPath>
49+
<_JavacSourceOptions>-source $(JavacSourceVersion) -target $(JavacTargetVersion) $(_BootClassPath)</_JavacSourceOptions>
5050
</PropertyGroup>
5151
<PropertyGroup>
5252
<_XamarinAndroidCecilPathCondition=" '$(CecilSourceDirectory)' != '' And Exists('$(UtilityOutputFullPath)Xamarin.Android.Cecil.dll') ">$(UtilityOutputFullPath)Xamarin.Android.Cecil.dll</_XamarinAndroidCecilPath>

‎build-tools/Java.Interop.BootstrapTasks/Java.Interop.BootstrapTasks/JdkInfo.cs‎

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ namespace Java.Interop.BootstrapTasks
1717
{
1818
publicclassJdkInfo:Task
1919
{
20-
conststringJARSIGNER="jarsigner.exe";
21-
conststringMDREG_KEY=@"SOFTWARE\Novell\Mono for Android";
22-
conststringMDREG_JAVA_SDK="JavaSdkDirectory";
23-
2420
publicstringJdksRoot{get;set;}
2521

2622
publicstringMaximumJdkVersion{get;set;}
@@ -50,13 +46,18 @@ public override bool Execute ()
5046
returnfalse;
5147
}
5248

49+
varrtJarPaths=new[]{
50+
Path.Combine(Path.GetDirectoryName(jdk.JavacPath),"..","jre","lib","rt.jar"),
51+
};
52+
varrtJarPath=rtJarPaths.FirstOrDefault(p =>File.Exists(p));
53+
5354
JavaHomePath=jdk.HomePath;
5455

5556
Directory.CreateDirectory(Path.GetDirectoryName(PropertyFile.ItemSpec));
5657
Directory.CreateDirectory(Path.GetDirectoryName(MakeFragmentFile.ItemSpec));
5758

58-
WritePropertyFile(jdk.JarPath,jdk.JavacPath,jdk.JdkJvmPath,jdk.IncludePath);
59-
WriteMakeFragmentFile(jdk.JarPath,jdk.JavacPath,jdk.JdkJvmPath,jdk.IncludePath);
59+
WritePropertyFile(jdk.JarPath,jdk.JavacPath,jdk.JdkJvmPath,rtJarPath,jdk.IncludePath);
60+
WriteMakeFragmentFile(jdk.JarPath,jdk.JavacPath,jdk.JdkJvmPath,rtJarPath,jdk.IncludePath);
6061

6162
return!Log.HasLoggedErrors;
6263
}
@@ -92,7 +93,7 @@ Action<TraceLevel, string> CreateLogger ()
9293
returnlogger;
9394
}
9495

95-
voidWritePropertyFile(stringjarPath,stringjavacPath,stringjdkJvmPath,IEnumerable<string>includes)
96+
voidWritePropertyFile(stringjarPath,stringjavacPath,stringjdkJvmPath,stringrtJarPath,IEnumerable<string>includes)
9697
{
9798
varmsbuild=XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");
9899
varproject=newXElement(msbuild+"Project",
@@ -106,17 +107,28 @@ void WritePropertyFile (string jarPath, string javacPath, string jdkJvmPath, IEn
106107
newXElement(msbuild+"JavaCPath",newXAttribute("Condition"," '$(JavaCPath)' == '' "),
107108
javacPath),
108109
newXElement(msbuild+"JarPath",newXAttribute("Condition"," '$(JarPath)' == '' "),
109-
jarPath)));
110+
jarPath),
111+
CreateJreRtJarPath(msbuild,rtJarPath)));
110112
project.Save(PropertyFile.ItemSpec);
111113
}
112114

113-
voidWriteMakeFragmentFile(stringjarPath,stringjavacPath,stringjdkJvmPath,IEnumerable<string>includes)
115+
staticXElementCreateJreRtJarPath(XNamespacemsbuild,stringrtJarPath)
116+
{
117+
if(rtJarPath==null)
118+
returnnull;
119+
returnnewXElement(msbuild+"JreRtJarPath",
120+
newXAttribute("Condition"," '$(JreRtJarPath)' == '' "),
121+
rtJarPath);
122+
}
123+
124+
voidWriteMakeFragmentFile(stringjarPath,stringjavacPath,stringjdkJvmPath,stringrtJarPath,IEnumerable<string>includes)
114125
{
115126
using(varo=newStreamWriter(MakeFragmentFile.ItemSpec)){
116127
o.WriteLine($"export JI_JAR_PATH := {jarPath}");
117128
o.WriteLine($"export JI_JAVAC_PATH := {javacPath}");
118129
o.WriteLine($"export JI_JDK_INCLUDE_PATHS := {string.Join(" ",includes)}");
119130
o.WriteLine($"export JI_JVM_PATH := {jdkJvmPath}");
131+
o.WriteLine($"export JI_RT_JAR_PATH := {rtJarPath}");
120132
}
121133
}
122134
}

‎external/xamarin-android-tools‎

‎tests/Xamarin.Android.Tools.Bytecode-Tests/IJavaInterfaceTests.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void ClassFile_WithIJavaInterface_class ()
1616
{
1717
varc=LoadClassFile(JavaType+".class");
1818
newExpectedTypeDeclaration{
19-
MajorVersion=0x32,
19+
MajorVersion=0x34,
2020
MinorVersion=0,
2121
ConstantPoolCount=23,
2222
AccessFlags=ClassAccessFlags.Interface|ClassAccessFlags.Abstract,

‎tests/Xamarin.Android.Tools.Bytecode-Tests/JavaAnnotationTests.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void ClassFile_WithJavaAnnotation_class ()
1616
{
1717
varc=LoadClassFile(JavaType+".class");
1818
newExpectedTypeDeclaration{
19-
MajorVersion=0x32,
19+
MajorVersion=0x34,
2020
MinorVersion=0,
2121
ConstantPoolCount=23,
2222
AccessFlags=ClassAccessFlags.Public|ClassAccessFlags.Interface|ClassAccessFlags.Abstract|ClassAccessFlags.Annotation,

‎tests/Xamarin.Android.Tools.Bytecode-Tests/JavaEnumTests.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void ClassFileDescription ()
2020
{
2121
varc=LoadClassFile(JavaType+".class");
2222
newExpectedTypeDeclaration{
23-
MajorVersion=0x32,
23+
MajorVersion=0x34,
2424
MinorVersion=0,
2525
ConstantPoolCount=53,
2626
AccessFlags=ClassAccessFlags.Final|ClassAccessFlags.Super|ClassAccessFlags.Enum,

‎tests/Xamarin.Android.Tools.Bytecode-Tests/JavaType.1Tests.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void ClassFileDescription ()
1616
{
1717
varc=LoadClassFile(JavaType+".class");
1818
newExpectedTypeDeclaration{
19-
MajorVersion=0x32,
19+
MajorVersion=0x34,
2020
MinorVersion=0,
2121
ConstantPoolCount=47,
2222
AccessFlags=ClassAccessFlags.Super,

‎tests/Xamarin.Android.Tools.Bytecode-Tests/JavaType.ASCTests.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void ClassFileDescription ()
1616
{
1717
varc=LoadClassFile(JavaType+".class");
1818
newExpectedTypeDeclaration{
19-
MajorVersion=0x32,
19+
MajorVersion=0x34,
2020
MinorVersion=0,
2121
ConstantPoolCount=23,
2222
Deprecated=true,

‎tests/Xamarin.Android.Tools.Bytecode-Tests/JavaType.PSCTests.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void ClassFileDescription ()
1616
{
1717
varc=LoadClassFile(JavaType+".class");
1818
newExpectedTypeDeclaration{
19-
MajorVersion=0x32,
19+
MajorVersion=0x34,
2020
MinorVersion=0,
2121
ConstantPoolCount=20,
2222
AccessFlags=ClassAccessFlags.Public|ClassAccessFlags.Super|ClassAccessFlags.Abstract,

‎tests/Xamarin.Android.Tools.Bytecode-Tests/JavaType.RNC.RPNCTests.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void ClassFileDescription ()
1616
{
1717
varc=LoadClassFile(JavaType+".class");
1818
newExpectedTypeDeclaration{
19-
MajorVersion=0x32,
19+
MajorVersion=0x34,
2020
MinorVersion=0,
2121
ConstantPoolCount=46,
2222
AccessFlags=ClassAccessFlags.Public|ClassAccessFlags.Super|ClassAccessFlags.Abstract,

0 commit comments

Comments
 (0)