Skip to content

Commit c19794e

Browse files
authored
[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 6d7266d commit c19794e

File tree

13 files changed

+36
-24
lines changed

13 files changed

+36
-24
lines changed

Directory.Build.props

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@
4343
<XamarinAndroidToolsDirectory Condition=" '$(XamarinAndroidToolsDirectory)' == '' ">$(MSBuildThisFileDirectory)external\xamarin-android-tools</XamarinAndroidToolsDirectory>
4444
</PropertyGroup>
4545
<PropertyGroup>
46-
<JavacSourceVersion Condition=" '$(JavacSourceVersion)' == '' ">1.6</JavacSourceVersion>
47-
<JavacTargetVersion Condition=" '$(JavacTargetVersion)' == '' ">1.6</JavacTargetVersion>
48-
<JreRtJarPath Condition=" '$(JreRtJarPath)' == '' And '$(JavaCPath)' != '' ">$([System.IO.Path]::GetDirectoryName('$(JavaCPath)'))\..\jre\lib\rt.jar</JreRtJarPath>
49-
<_JavacSourceOptions>-source $(JavacSourceVersion) -target $(JavacTargetVersion) -bootclasspath "$(JreRtJarPath)"</_JavacSourceOptions>
46+
<JavacSourceVersion Condition=" '$(JavacSourceVersion)' == '' ">1.8</JavacSourceVersion>
47+
<JavacTargetVersion Condition=" '$(JavacTargetVersion)' == '' ">1.8</JavacTargetVersion>
48+
<_BootClassPath Condition=" '$(JreRtJarPath)' != '' ">-bootclasspath "$(JreRtJarPath)"</_BootClassPath>
49+
<_JavacSourceOptions>-source $(JavacSourceVersion) -target $(JavacTargetVersion) $(_BootClassPath)</_JavacSourceOptions>
5050
</PropertyGroup>
5151
<PropertyGroup>
5252
<_XamarinAndroidCecilPath Condition=" '$(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
public class JdkInfo : Task
1919
{
20-
const string JARSIGNER = "jarsigner.exe";
21-
const string MDREG_KEY = @"SOFTWARE\Novell\Mono for Android";
22-
const string MDREG_JAVA_SDK = "JavaSdkDirectory";
23-
2420
public string JdksRoot { get; set; }
2521

2622
public string MaximumJdkVersion { get; set; }
@@ -50,13 +46,18 @@ public override bool Execute ()
5046
return false;
5147
}
5248

49+
var rtJarPaths = new[]{
50+
Path.Combine (Path.GetDirectoryName (jdk.JavacPath), "..", "jre", "lib", "rt.jar"),
51+
};
52+
var rtJarPath = 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
return logger;
9394
}
9495

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

113-
void WriteMakeFragmentFile (string jarPath, string javacPath, string jdkJvmPath, IEnumerable<string> includes)
115+
static XElement CreateJreRtJarPath (XNamespace msbuild, string rtJarPath)
116+
{
117+
if (rtJarPath == null)
118+
return null;
119+
return new XElement (msbuild + "JreRtJarPath",
120+
new XAttribute ("Condition", " '$(JreRtJarPath)' == '' "),
121+
rtJarPath);
122+
}
123+
124+
void WriteMakeFragmentFile (string jarPath, string javacPath, string jdkJvmPath, string rtJarPath, IEnumerable<string> includes)
114125
{
115126
using (var o = new StreamWriter (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
}

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
var c = LoadClassFile (JavaType + ".class");
1818
new ExpectedTypeDeclaration {
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
var c = LoadClassFile (JavaType + ".class");
1818
new ExpectedTypeDeclaration {
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
var c = LoadClassFile (JavaType + ".class");
2222
new ExpectedTypeDeclaration {
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
var c = LoadClassFile (JavaType + ".class");
1818
new ExpectedTypeDeclaration {
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
var c = LoadClassFile (JavaType + ".class");
1818
new ExpectedTypeDeclaration {
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
var c = LoadClassFile (JavaType + ".class");
1818
new ExpectedTypeDeclaration {
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
var c = LoadClassFile (JavaType + ".class");
1818
new ExpectedTypeDeclaration {
19-
MajorVersion = 0x32,
19+
MajorVersion = 0x34,
2020
MinorVersion = 0,
2121
ConstantPoolCount = 46,
2222
AccessFlags = ClassAccessFlags.Public | ClassAccessFlags.Super | ClassAccessFlags.Abstract,

tests/Xamarin.Android.Tools.Bytecode-Tests/JavaType.RNCTests.cs

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

tests/Xamarin.Android.Tools.Bytecode-Tests/JavaTypeTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public void ClassFile_WithJavaType_class ()
1818
{
1919
var c = LoadClassFile ("JavaType.class");
2020
new ExpectedTypeDeclaration {
21-
MajorVersion = 0x32,
21+
MajorVersion = 0x34,
2222
MinorVersion = 0,
2323
ConstantPoolCount = 195,
2424
AccessFlags = ClassAccessFlags.Public | ClassAccessFlags.Super,

tests/Xamarin.Android.Tools.Bytecode-Tests/NonGenericGlobalTypeTests.cs

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

0 commit comments

Comments
 (0)