Skip to content

Commit 5bb0d24

Browse files
authored
[build] Add support for JDK 17 (#1141)
Update `<JdkInfo/>` task to emit new `$(Java*MajorVersion)` and `$(JavaApi*DefineConstants)` MSBuild properties. These are used by `src/Java.Base` so that it knows which JDK version it's binding. Update `src/Java.Base` to support binding the `java.base.jmod` from JDK 17. Note: This "JDK-17 Java.Base binding" was a "time limited" effort. To build against JDK-17: 1. Install JDK-17. 2. Prepare and override `$(JdksRoot)`: dotnet build -t:Prepare Java.Interop.sln -p:JdksRoot=/Library/Java/JavaVirtualMachines/microsoft-17.jdk/Contents/Home will use the Microsoft OpenJDK 17 installation on macOS. 3. Build: dotnet build Java.Interop.sln
1 parent 7e3bd2f commit 5bb0d24

File tree

10 files changed

+139
-4
lines changed

10 files changed

+139
-4
lines changed

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

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ public override bool Execute ()
6161
JavaHomePath = jdk.HomePath;
6262

6363
Directory.CreateDirectory (Path.GetDirectoryName (PropertyFile.ItemSpec));
64-
WritePropertyFile (jdk.JavaPath, jdk.JarPath, jdk.JavacPath, jdk.JdkJvmPath, rtJarPath, jdk.IncludePath);
64+
WritePropertyFile (jdk, rtJarPath);
6565

6666
if (MakeFragmentFile != null) {
6767
Directory.CreateDirectory (Path.GetDirectoryName (MakeFragmentFile.ItemSpec));
68-
WriteMakeFragmentFile (jdk.JavaPath, jdk.JarPath, jdk.JavacPath, jdk.JdkJvmPath, rtJarPath, jdk.IncludePath);
68+
WriteMakeFragmentFile (jdk, rtJarPath);
6969
}
7070

7171
return !Log.HasLoggedErrors;
@@ -117,8 +117,14 @@ Action<TraceLevel, string> CreateLogger ()
117117
return logger;
118118
}
119119

120-
void WritePropertyFile (string javaPath, string jarPath, string javacPath, string jdkJvmPath, string rtJarPath, IEnumerable<string> includes)
120+
void WritePropertyFile (XATInfo jdk, string rtJarPath)
121121
{
122+
var jarPath = jdk.JarPath;
123+
var javacPath = jdk.JavacPath;
124+
var javaPath = jdk.JavaPath;
125+
var jdkJvmPath = jdk.JdkJvmPath;
126+
var includes = jdk.IncludePath;
127+
122128
var msbuild = XNamespace.Get ("http://schemas.microsoft.com/developer/msbuild/2003");
123129
var jdkJvmP = $"JdkJvm{PropertyNameModifier}Path";
124130
var project = new XElement (msbuild + "Project",
@@ -129,6 +135,9 @@ void WritePropertyFile (string javaPath, string jarPath, string javacPath, strin
129135
new XElement (msbuild + "ItemGroup",
130136
includes.Select (i => new XElement (msbuild + $"Jdk{PropertyNameModifier}IncludePath", new XAttribute ("Include", i)))))),
131137
new XElement (msbuild + "PropertyGroup",
138+
CreateProperty (msbuild, $"JavaApi{PropertyNameModifier}DefineConstants",
139+
string.Join (";", Enumerable.Range (11, jdk.Version.Major-11+1).Select (v => $"JAVA_API_{v}"))),
140+
CreateProperty (msbuild, $"Java{PropertyNameModifier}MajorVersion", jdk.Version.Major.ToString ()),
132141
CreateProperty (msbuild, $"Java{PropertyNameModifier}SdkDirectory", JavaHomePath),
133142
CreateProperty (msbuild, $"Java{PropertyNameModifier}Path", javaPath),
134143
CreateProperty (msbuild, $"JavaC{PropertyNameModifier}Path", javacPath),
@@ -148,8 +157,15 @@ XElement CreateProperty (XNamespace msbuild, string propertyName, string propert
148157
new XAttribute ("Condition", $" '$({propertyName})' == '' "),
149158
propertyValue);
150159
}
151-
void WriteMakeFragmentFile (string javaPath, string jarPath, string javacPath, string jdkJvmPath, string rtJarPath, IEnumerable<string> includes)
160+
161+
void WriteMakeFragmentFile (XATInfo jdk, string rtJarPath)
152162
{
163+
var jarPath = jdk.JarPath;
164+
var javacPath = jdk.JavacPath;
165+
var javaPath = jdk.JavaPath;
166+
var jdkJvmPath = jdk.JdkJvmPath;
167+
var includes = jdk.IncludePath;
168+
153169
using (var o = new StreamWriter (MakeFragmentFile.ItemSpec)) {
154170
o.WriteLine ($"export JI_JAR_PATH := {jarPath}");
155171
o.WriteLine ($"export JI_JAVA_PATH := {javaPath}");

build-tools/scripts/Prepare.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<_MaxJdk>$(MaxJdkVersion)</_MaxJdk>
1717
<_MaxJdk Condition=" '$(_MaxJdk)' == '' ">$(JI_MAX_JDK)</_MaxJdk>
1818
<JdksRoot Condition=" '$(JdksRoot)' == '' And '$(JAVA_HOME_11_X64)' != '' And Exists($(JAVA_HOME_11_X64)) ">$(JAVA_HOME_11_X64)</JdksRoot>
19+
<JdksRoot Condition=" '$(JdksRoot)' == '' And '$(JAVA_HOME_17_X64)' != '' And Exists($(JAVA_HOME_17_X64)) ">$(JAVA_HOME_17_X64)</JdksRoot>
1920
</PropertyGroup>
2021
<JdkInfo
2122
JdksRoot="$(JdksRoot)"

src/Java.Base/Java.Base.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
<PropertyGroup>
44
<GeneratorPath>$(UtilityOutputFullPath)generator.dll</GeneratorPath>
5+
<DefineConstants>$(JavaApiDefineConstants);$(DefineConstants);</DefineConstants>
56
</PropertyGroup>
67

78
<ItemGroup>

src/Java.Base/Java.Lang/Class.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System;
2+
using Java.Interop;
3+
4+
#if JAVA_API_17
5+
using Java.Lang.Invoke;
6+
using Java.Lang.Constants;
7+
8+
namespace Java.Lang {
9+
public partial class Class {
10+
11+
}
12+
}
13+
14+
#endif // JAVA_API_17

src/Java.Base/Java.Lang/Double.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using Java.Interop;
3+
4+
#if JAVA_API_17
5+
using Java.Lang.Invoke;
6+
using Java.Lang.Constants;
7+
8+
namespace Java.Lang {
9+
public partial class Double {
10+
11+
Java.Lang.Object? IConstantDesc.ResolveConstantDesc (MethodHandles.Lookup? lookup) =>
12+
ResolveConstantDesc (lookup);
13+
}
14+
}
15+
16+
#endif // JAVA_API_17

src/Java.Base/Java.Lang/Float.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using Java.Interop;
3+
4+
#if JAVA_API_17
5+
using Java.Lang.Invoke;
6+
using Java.Lang.Constants;
7+
8+
namespace Java.Lang {
9+
public partial class Float {
10+
11+
Java.Lang.Object? IConstantDesc.ResolveConstantDesc (MethodHandles.Lookup? lookup) =>
12+
ResolveConstantDesc (lookup);
13+
}
14+
}
15+
16+
#endif // JAVA_API_17

src/Java.Base/Java.Lang/Integer.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using Java.Interop;
3+
4+
#if JAVA_API_17
5+
using Java.Lang.Invoke;
6+
using Java.Lang.Constants;
7+
8+
namespace Java.Lang {
9+
public partial class Integer {
10+
11+
Java.Lang.Object? IConstantDesc.ResolveConstantDesc (MethodHandles.Lookup? lookup) =>
12+
ResolveConstantDesc (lookup);
13+
}
14+
}
15+
16+
#endif // JAVA_API_17

src/Java.Base/Java.Lang/Long.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using Java.Interop;
3+
4+
#if JAVA_API_17
5+
using Java.Lang.Invoke;
6+
using Java.Lang.Constants;
7+
8+
namespace Java.Lang {
9+
public partial class Long {
10+
11+
Java.Lang.Object? IConstantDesc.ResolveConstantDesc (MethodHandles.Lookup? lookup) =>
12+
ResolveConstantDesc (lookup);
13+
}
14+
}
15+
16+
#endif // JAVA_API_17

src/Java.Base/Java.Lang/String.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,27 @@
33
using System.Collections.Generic;
44
using Java.Interop;
55

6+
#if JAVA_API_17
7+
using Java.Lang.Invoke;
8+
using Java.Lang.Constants;
9+
#endif // JAVA_API_17
10+
611
namespace Java.Lang {
712
public partial class String : IEnumerable, IEnumerable<char> {
13+
14+
#if JAVA_API_17
15+
unsafe Java.Lang.Object? IConstantDesc.ResolveConstantDesc (MethodHandles.Lookup? lookup)
16+
{
17+
const string __id = "resolveConstantDesc.(Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/String;";
18+
try {
19+
JniArgumentValue* __args = stackalloc JniArgumentValue [1];
20+
__args [0] = new JniArgumentValue (lookup);
21+
var __rm = _members.InstanceMethods.InvokeAbstractObjectMethod (__id, this, __args);
22+
return JniEnvironment.Runtime.ValueManager.GetValue<String>(ref __rm, JniObjectReferenceOptions.CopyAndDispose);
23+
} finally {
24+
global::System.GC.KeepAlive (lookup);
25+
}
26+
}
27+
#endif // JAVA_API_17
828
}
929
}

src/Java.Base/Transforms/Metadata.xml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
<!-- Type / Namespace conflicts -->
88
<ns-replace source="java.lang.module" replacement="Java.Lang.Modules" />
9+
<ns-replace source="java.lang.runtime" replacement="Java.Lang.Runtimes" />
10+
<ns-replace source="java.lang.constant" replacement="Java.Lang.Constants" />
911

1012
<!-- Bind `Object.finalize()` as `Object.JavaFinalize()` -->
1113
<attr path="/api/package[@name='java.lang']//method[@name='finalize' and count(parameter)=0]" name="managedName">JavaFinalize</attr>
@@ -62,4 +64,21 @@
6264
<attr path="/api/package[@name='java.lang']/class[@name='StringBuffer']" name="extends">java.lang.Object</attr>
6365
<remove-node path="//api/package[@name='java.lang']/class[@name='StringBuffer']/method[@jni-return='Ljava/lang/AbstractStringBuilder;']" />
6466
<remove-node path="//api/package[@name='java.lang']/class[@name='StringBuffer']/method[@jni-return='Ljava/lang/Appendable;']" />
67+
68+
<!-- JDK 17? -->
69+
<remove-node path="/api/package[@name='java.lang.invoke']/interface[@name='TypeDescriptor']" />
70+
<attr path="/api/package[@name='java.lang']/class[@name='Record']/method[@name='equals' and count(parameter)=1 and parameter[1][@type='java.lang.Object']]"
71+
name="managedOverride">override</attr>
72+
<attr path="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedType']/method[@name='getAnnotation' and count(parameter)=1 and parameter[1][@type='java.lang.Class&lt;T&gt;']]"
73+
name="managedOverride">reabstract</attr>
74+
<attr path="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedType']/method[@name='getAnnotation' and count(parameter)=1 and parameter[1][@type='java.lang.Class&lt;T&gt;']]"
75+
name="explicitInterface">IAnnotatedElement</attr>
76+
<attr path="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedType']/method[@name='getAnnotations' and count(parameter)=0]"
77+
name="managedOverride">reabstract</attr>
78+
<attr path="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedType']/method[@name='getAnnotations' and count(parameter)=0]"
79+
name="explicitInterface">IAnnotatedElement</attr>
80+
<attr path="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedType']/method[@name='getDeclaredAnnotations' and count(parameter)=0]"
81+
name="managedOverride">reabstract</attr>
82+
<attr path="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedType']/method[@name='getDeclaredAnnotations' and count(parameter)=0]"
83+
name="explicitInterface">IAnnotatedElement</attr>
6584
</metadata>

0 commit comments

Comments
 (0)