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

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

10 files changed

Lines changed: 139 additions & 4 deletions

File tree

‎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
returnlogger;
118118
}
119119

120-
voidWritePropertyFile(stringjavaPath,stringjarPath,stringjavacPath,stringjdkJvmPath,stringrtJarPath,IEnumerable<string>includes)
120+
voidWritePropertyFile(XATInfojdk,stringrtJarPath)
121121
{
122+
varjarPath=jdk.JarPath;
123+
varjavacPath=jdk.JavacPath;
124+
varjavaPath=jdk.JavaPath;
125+
varjdkJvmPath=jdk.JdkJvmPath;
126+
varincludes=jdk.IncludePath;
127+
122128
varmsbuild=XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");
123129
varjdkJvmP=$"JdkJvm{PropertyNameModifier}Path";
124130
varproject=newXElement(msbuild+"Project",
@@ -129,6 +135,9 @@ void WritePropertyFile (string javaPath, string jarPath, string javacPath, strin
129135
newXElement(msbuild+"ItemGroup",
130136
includes.Select(i =>newXElement(msbuild+$"Jdk{PropertyNameModifier}IncludePath",newXAttribute("Include",i)))))),
131137
newXElement(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
newXAttribute("Condition",$" '$({propertyName})' == '' "),
149158
propertyValue);
150159
}
151-
voidWriteMakeFragmentFile(stringjavaPath,stringjarPath,stringjavacPath,stringjdkJvmPath,stringrtJarPath,IEnumerable<string>includes)
160+
161+
voidWriteMakeFragmentFile(XATInfojdk,stringrtJarPath)
152162
{
163+
varjarPath=jdk.JarPath;
164+
varjavacPath=jdk.JavacPath;
165+
varjavaPath=jdk.JavaPath;
166+
varjdkJvmPath=jdk.JdkJvmPath;
167+
varincludes=jdk.IncludePath;
168+
153169
using(varo=newStreamWriter(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
<_MaxJdkCondition=" '$(_MaxJdk)' == '' ">$(JI_MAX_JDK)</_MaxJdk>
1818
<JdksRootCondition=" '$(JdksRoot)' == '' And '$(JAVA_HOME_11_X64)' != '' And Exists($(JAVA_HOME_11_X64)) ">$(JAVA_HOME_11_X64)</JdksRoot>
19+
<JdksRootCondition=" '$(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+
usingSystem;
2+
usingJava.Interop;
3+
4+
#if JAVA_API_17
5+
usingJava.Lang.Invoke;
6+
usingJava.Lang.Constants;
7+
8+
namespaceJava.Lang{
9+
publicpartialclassClass{
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+
usingSystem;
2+
usingJava.Interop;
3+
4+
#if JAVA_API_17
5+
usingJava.Lang.Invoke;
6+
usingJava.Lang.Constants;
7+
8+
namespaceJava.Lang{
9+
publicpartialclassDouble{
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+
usingSystem;
2+
usingJava.Interop;
3+
4+
#if JAVA_API_17
5+
usingJava.Lang.Invoke;
6+
usingJava.Lang.Constants;
7+
8+
namespaceJava.Lang{
9+
publicpartialclassFloat{
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+
usingSystem;
2+
usingJava.Interop;
3+
4+
#if JAVA_API_17
5+
usingJava.Lang.Invoke;
6+
usingJava.Lang.Constants;
7+
8+
namespaceJava.Lang{
9+
publicpartialclassInteger{
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+
usingSystem;
2+
usingJava.Interop;
3+
4+
#if JAVA_API_17
5+
usingJava.Lang.Invoke;
6+
usingJava.Lang.Constants;
7+
8+
namespaceJava.Lang{
9+
publicpartialclassLong{
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
usingSystem.Collections.Generic;
44
usingJava.Interop;
55

6+
#if JAVA_API_17
7+
usingJava.Lang.Invoke;
8+
usingJava.Lang.Constants;
9+
#endif // JAVA_API_17
10+
611
namespaceJava.Lang{
712
publicpartialclassString:IEnumerable,IEnumerable<char>{
13+
14+
#if JAVA_API_17
15+
unsafeJava.Lang.Object?IConstantDesc.ResolveConstantDesc(MethodHandles.Lookup?lookup)
16+
{
17+
conststring__id="resolveConstantDesc.(Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/String;";
18+
try{
19+
JniArgumentValue*__args=stackallocJniArgumentValue[1];
20+
__args[0]=newJniArgumentValue(lookup);
21+
var__rm=_members.InstanceMethods.InvokeAbstractObjectMethod(__id,this,__args);
22+
returnJniEnvironment.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-replacesource="java.lang.module"replacement="Java.Lang.Modules" />
9+
<ns-replacesource="java.lang.runtime"replacement="Java.Lang.Runtimes" />
10+
<ns-replacesource="java.lang.constant"replacement="Java.Lang.Constants" />
911

1012
<!-- Bind `Object.finalize()` as `Object.JavaFinalize()` -->
1113
<attrpath="/api/package[@name='java.lang']//method[@name='finalize' and count(parameter)=0]"name="managedName">JavaFinalize</attr>
@@ -62,4 +64,21 @@
6264
<attrpath="/api/package[@name='java.lang']/class[@name='StringBuffer']"name="extends">java.lang.Object</attr>
6365
<remove-nodepath="//api/package[@name='java.lang']/class[@name='StringBuffer']/method[@jni-return='Ljava/lang/AbstractStringBuilder;']" />
6466
<remove-nodepath="//api/package[@name='java.lang']/class[@name='StringBuffer']/method[@jni-return='Ljava/lang/Appendable;']" />
67+
68+
<!-- JDK 17? -->
69+
<remove-nodepath="/api/package[@name='java.lang.invoke']/interface[@name='TypeDescriptor']" />
70+
<attrpath="/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+
<attrpath="/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+
<attrpath="/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+
<attrpath="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedType']/method[@name='getAnnotations' and count(parameter)=0]"
77+
name="managedOverride">reabstract</attr>
78+
<attrpath="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedType']/method[@name='getAnnotations' and count(parameter)=0]"
79+
name="explicitInterface">IAnnotatedElement</attr>
80+
<attrpath="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedType']/method[@name='getDeclaredAnnotations' and count(parameter)=0]"
81+
name="managedOverride">reabstract</attr>
82+
<attrpath="/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)