Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
d865766
[marshal methods] Move marshal method classification and rewriting to…
sbomer Apr 3, 2026
096e4ae
[marshal methods] Consolidate .ll generation into the inner build
sbomer Apr 3, 2026
e92f56e
[marshal methods] Write rewritten assemblies to separate output direc…
sbomer Apr 9, 2026
8857691
[marshal methods] Skip NativeAOT builds and fix PDB output items
sbomer Apr 13, 2026
853fdaf
Fix resource leak and missing lookup info in RewriteMarshalMethods
sbomer Apr 14, 2026
5c4ad1f
Generate ApplicationRegistration.java in inner build when marshal met…
sbomer Apr 14, 2026
28ebcaf
Retry CI
sbomer Apr 15, 2026
5f0e4cb
Merge branch 'main' into dev/sbomer/rewrite-marshal-methods-v2
sbomer Apr 16, 2026
5a116d4
Fix test failures for per-RID marshal method rewriting
sbomer Apr 16, 2026
2dd29df
Merge branch 'main' into dev/sbomer/rewrite-marshal-methods-v2
sbomer Apr 22, 2026
55ba3a2
Merge branch 'main' into dev/sbomer/rewrite-marshal-methods-v2
sbomer Apr 27, 2026
b2d1bde
Remove marshal method classification from outer build
sbomer Apr 27, 2026
3f278de
Move _RewriteMarshalMethodsInner to Common.targets for all typemap paths
sbomer Apr 28, 2026
be65be9
Merge remote-tracking branch 'origin/main' into marshal-methods-v2
sbomer Apr 29, 2026
469456f
Remove test scripts and pr-message from tracked files
sbomer Apr 29, 2026
e5d6f9b
Merge remote-tracking branch 'origin/main' into marshal-methods-v2
sbomer May 7, 2026
b54a50f
Merge remote-tracking branch 'origin/main' into marshal-methods-v2
sbomer May 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion external/Java.Interop
Submodule Java.Interop updated 59 files
+0 −124 .github/skills/java-interop-reviewer/SKILL.md
+0 −25 .github/skills/java-interop-reviewer/references/ai-pitfalls.md
+0 −77 .github/skills/java-interop-reviewer/references/csharp-rules.md
+0 −31 .github/skills/java-interop-reviewer/references/interop-rules.md
+0 −44 .github/skills/java-interop-reviewer/references/msbuild-rules.md
+0 −35 .github/skills/java-interop-reviewer/references/native-rules.md
+0 −96 .github/skills/java-interop-reviewer/references/repo-conventions.md
+0 −22 .github/skills/java-interop-reviewer/references/security-rules.md
+0 −18 .github/skills/java-interop-reviewer/references/testing-rules.md
+0 −1,312 .github/workflows/java-interop-reviewer.lock.yml
+0 −59 .github/workflows/java-interop-reviewer.md
+37 −1 Java.Interop.sln
+26 −0 Makefile
+43 −0 build-tools/automation/templates/core-tests.yaml
+1 −1 external/xamarin-android-tools
+0 −1 samples/Hello-Java.Base/Hello-Java.Base.csproj
+5 −0 samples/Hello-NativeAOTFromAndroid/Hello-NativeAOTFromAndroid.csproj
+25 −0 samples/Hello-NativeAOTFromAndroid/Hello-NativeAOTFromAndroid.targets
+1 −0 samples/Hello-NativeAOTFromAndroid/JavaInteropRuntime.cs
+5 −0 samples/Hello-NativeAOTFromJNI/Hello-NativeAOTFromJNI.csproj
+24 −0 samples/Hello-NativeAOTFromJNI/Hello-NativeAOTFromJNI.targets
+0 −32 samples/Hello-NativeAOTFromJNI/JavaCallableAttributes.cs
+1 −0 samples/Hello-NativeAOTFromJNI/JavaInteropRuntime.cs
+1 −26 samples/Hello-NativeAOTFromJNI/ManagedType.cs
+25 −0 src/Java.Interop.Export/Java.Interop.Export.csproj
+0 −0 src/Java.Interop.Export/Java.Interop/JavaCallableAttribute.cs
+0 −0 src/Java.Interop.Export/Java.Interop/JavaCallableConstructorAttribute.cs
+545 −0 src/Java.Interop.Export/Java.Interop/MarshalMemberBuilder.cs
+27 −0 src/Java.Interop.Tools.Expressions/Java.Interop.Tools.Expressions.csproj
+828 −0 src/Java.Interop.Tools.Expressions/Java.Interop.Tools.Expressions/CecilCompilerExpressionVisitor.cs
+443 −0 src/Java.Interop.Tools.Expressions/Java.Interop.Tools.Expressions/ExpressionAssemblyBuilder.cs
+9 −0 src/Java.Interop.Tools.Expressions/Java.Interop.Tools.Expressions/ExpressionMethodRegistration.cs
+1 −0 src/Java.Interop/GlobalSuppressions.cs
+164 −10 src/Java.Interop/Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs
+3 −0 src/Java.Interop/Java.Interop/JniRuntime.cs
+101 −4 src/Java.Runtime.Environment/Java.Interop/JreTypeManager.cs
+10 −0 src/Java.Runtime.Environment/Java.Interop/ManagedValueManager.cs
+2 −13 src/Java.Runtime.Environment/Java.Interop/MonoRuntimeValueManager.cs
+1 −0 src/Java.Runtime.Environment/Java.Runtime.Environment.csproj
+0 −50 tests/Java.Base-Tests/Java.Base/JavaToManagedTests.cs
+19 −0 tests/Java.Interop-Tests/Java.Interop/JniRuntimeTest.cs
+4 −4 tests/Java.Interop-Tests/Java.Interop/TestType.cs
+41 −0 tests/Java.Interop.Export-Tests/Java.Interop.Export-Tests.csproj
+53 −0 tests/Java.Interop.Export-Tests/Java.Interop.Export-Tests.targets
+286 −0 tests/Java.Interop.Export-Tests/Java.Interop/ExportTest.cs
+36 −0 tests/Java.Interop.Export-Tests/Java.Interop/JavaCallableExample.cs
+27 −0 tests/Java.Interop.Export-Tests/Java.Interop/JavaCallableExampleTests.cs
+29 −0 tests/Java.Interop.Export-Tests/Java.Interop/JavaVMFixture.cs
+570 −0 tests/Java.Interop.Export-Tests/Java.Interop/MarshalMemberBuilderTest.cs
+162 −0 tests/Java.Interop.Export-Tests/java/net/dot/jni/test/ExportType.java
+11 −0 tests/Java.Interop.Export-Tests/java/net/dot/jni/test/UseJavaCallableExample.java
+33 −0 tests/Java.Interop.Tools.Expressions-Tests/Java.Interop.Tools.Expressions-Tests.csproj
+444 −0 .../Java.Interop.Tools.Expressions-Tests/Java.Interop.Tools.ExpressionsTests/ExpressionAssemblyBuilderTests.cs
+1 −0 tests/Java.Interop.Tools.Expressions-Tests/Usings.cs
+2 −0 tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers-Tests.csproj
+848 −0 tools/jnimarshalmethod-gen/App.cs
+29 −0 tools/jnimarshalmethod-gen/Message.cs
+549 −0 tools/jnimarshalmethod-gen/TypeMover.cs
+40 −0 tools/jnimarshalmethod-gen/Xamarin.Android.Tools.JniMarshalMethodGenerator.csproj
2 changes: 1 addition & 1 deletion external/xamarin-android-tools
Submodule xamarin-android-tools updated 36 files
+1 −3 .gitattributes
+0 −178 .github/agents/agentic-workflows.agent.md
+0 −9 .github/aw/actions-lock.json
+8 −2 .github/copilot-instructions.md
+33 −34 .github/skills/android-tools-reviewer/SKILL.md
+0 −23 .github/skills/android-tools-reviewer/references/ai-pitfalls.md
+0 −109 .github/skills/android-tools-reviewer/references/csharp-rules.md
+0 −31 .github/skills/android-tools-reviewer/references/msbuild-rules.md
+0 −58 .github/skills/android-tools-reviewer/references/repo-conventions.md
+208 −0 .github/skills/android-tools-reviewer/references/review-rules.md
+0 −21 .github/skills/android-tools-reviewer/references/security-rules.md
+0 −12 .github/skills/android-tools-reviewer/references/testing-rules.md
+153 −0 .github/skills/android-tools-reviewer/scripts/submit_review.cs
+0 −1,312 .github/workflows/android-tools-reviewer.lock.yml
+0 −59 .github/workflows/android-tools-reviewer.md
+1 −6 .github/workflows/copilot-setup-steps.yml
+2 −2 src/Microsoft.Android.Build.BaseTasks/AndroidRidAbiHelper.cs
+2 −2 src/Microsoft.Android.Build.BaseTasks/AndroidRunToolTask.cs
+9 −9 src/Microsoft.Android.Build.BaseTasks/AsyncTask.cs
+29 −48 src/Microsoft.Android.Build.BaseTasks/Files.cs
+4 −4 src/Microsoft.Android.Build.BaseTasks/LinePreservedXmlWriter.cs
+2 −2 src/Microsoft.Android.Build.BaseTasks/MSBuildExtensions.cs
+0 −2 src/Microsoft.Android.Build.BaseTasks/Microsoft.Android.Build.BaseTasks.csproj
+0 −3 src/Xamarin.Android.Tools.AndroidSdk/AndroidVersions.cs
+29 −3 src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs
+1 −0 src/Xamarin.Android.Tools.AndroidSdk/Jdks/OracleJdkLocations.cs
+0 −9 src/Xamarin.Android.Tools.AndroidSdk/Models/AvdDeviceProfile.cs
+2 −0 src/Xamarin.Android.Tools.AndroidSdk/OS.cs
+0 −5 src/Xamarin.Android.Tools.AndroidSdk/PublicAPI/net10.0/PublicAPI.Unshipped.txt
+0 −5 src/Xamarin.Android.Tools.AndroidSdk/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt
+0 −29 src/Xamarin.Android.Tools.AndroidSdk/Runners/AvdManagerRunner.cs
+40 −49 src/Xamarin.Android.Tools.AndroidSdk/Runners/EmulatorRunner.cs
+0 −74 tests/Microsoft.Android.Build.BaseTasks-Tests/FilesTests.cs
+0 −57 tests/Xamarin.Android.Tools.AndroidSdk-Tests/AvdManagerRunnerTests.cs
+0 −32 tests/Xamarin.Android.Tools.AndroidSdk-Tests/EmulatorRunnerTests.cs
+4 −4 tests/Xamarin.Android.Tools.Benchmarks/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ public class FindJavaObjectsStep : BaseStep, IAssemblyModifierPipelineStep

public bool ErrorOnCustomJavaObject { get; set; }

public bool UseMarshalMethods { get; set; }

public TaskLoggingHelper Log { get; set; }

public FindJavaObjectsStep (TaskLoggingHelper log) => Log = log;
Expand Down Expand Up @@ -114,11 +112,6 @@ List<CallableWrapperType> ConvertToCallableWrappers (List<TypeDefinition> types)
DefaultMonoRuntimeInitialization = "mono.MonoPackageManager.LoadApplication (context);",
};

if (UseMarshalMethods) {
var classifier = new MarshalMethodsClassifier (Context, Context.Resolver, Log);
reader_options.MethodClassifier = new MarshalMethodsCollection (classifier);
}

foreach (var type in types) {
var wrapper = CecilImporter.CreateType (type, Context, reader_options);
wrappers.Add (wrapper);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,6 @@
EnableNativeRuntimeLinking="$(_AndroidEnableNativeRuntimeLinking)">
</GenerateJavaStubs>

<RewriteMarshalMethods
Condition=" '$(_AndroidUseMarshalMethods)' == 'true' And '$(AndroidIncludeDebugSymbols)' == 'false' "
EnableManagedMarshalMethodsLookup="$(_AndroidUseManagedMarshalMethodsLookup)"
Environments="@(_EnvironmentFiles)"
IntermediateOutputDirectory="$(IntermediateOutputPath)">
</RewriteMarshalMethods>

<GenerateTypeMappings
AndroidRuntime="$(_AndroidRuntime)"
Debug="$(AndroidIncludeDebugSymbols)"
Expand Down Expand Up @@ -132,6 +125,7 @@
<GenerateAdditionalProviderSources
AdditionalProviderSources="@(_AdditionalProviderSources)"
AndroidRuntime="$(_AndroidRuntime)"
EnableMarshalMethods="$(_AndroidUseMarshalMethods)"
Environments="@(_EnvironmentFiles)"
HttpClientHandlerType="$(AndroidHttpClientHandlerType)"
EnableSGenConcurrent="$(AndroidEnableSGenConcurrent)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@ protected virtual void BuildPipeline (AssemblyPipeline pipeline, MSBuildLinkCont
var findJavaObjectsStep = new FindJavaObjectsStep (Log) {
ApplicationJavaClass = ApplicationJavaClass,
ErrorOnCustomJavaObject = ErrorOnCustomJavaObject,
UseMarshalMethods = EnableMarshalMethods,
};

findJavaObjectsStep.Initialize (context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ public sealed class GenerateAdditionalProviderSources : AndroidTask
public string? HttpClientHandlerType { get; set; }
public bool EnableSGenConcurrent { get; set; }

/// <summary>
/// When true, <c>ApplicationRegistration.java</c> is generated by the inner build's
/// <see cref="RewriteMarshalMethods"/> task (which has the classifier to filter types).
/// This task skips generating it to avoid overwriting the inner build's output.
/// </summary>
public bool EnableMarshalMethods { get; set; }

AndroidRuntime androidRuntime;
JavaPeerStyle codeGenerationTarget;

Expand Down Expand Up @@ -90,29 +97,34 @@ void Generate (NativeCodeGenStateObject codeGenState)
}

// Create additional application java sources.
StringWriter regCallsWriter = new StringWriter ();
regCallsWriter.WriteLine ("// Application and Instrumentation ACWs must be registered first.");

foreach ((string jniName, string assemblyQualifiedName) in codeGenState.ApplicationsAndInstrumentationsToRegister) {
regCallsWriter.WriteLine (
codeGenerationTarget == JavaPeerStyle.XAJavaInterop1 ?
"\t\tmono.android.Runtime.register (\"{0}\", {1}.class, {1}.__md_methods);" :
"\t\tnet.dot.jni.ManagedPeer.registerNativeMembers ({1}.class, {1}.__md_methods);",
assemblyQualifiedName,
jniName
);
}
// When marshal methods are enabled, ApplicationRegistration.java is generated
// by RewriteMarshalMethods in the inner build, which has the classifier to
// filter out types with no dynamically registered methods.
if (!EnableMarshalMethods) {
StringWriter regCallsWriter = new StringWriter ();
regCallsWriter.WriteLine ("// Application and Instrumentation ACWs must be registered first.");

foreach ((string jniName, string assemblyQualifiedName) in codeGenState.ApplicationsAndInstrumentationsToRegister) {
regCallsWriter.WriteLine (
codeGenerationTarget == JavaPeerStyle.XAJavaInterop1 ?
"\t\tmono.android.Runtime.register (\"{0}\", {1}.class, {1}.__md_methods);" :
"\t\tnet.dot.jni.ManagedPeer.registerNativeMembers ({1}.class, {1}.__md_methods);",
assemblyQualifiedName,
jniName
);
}

regCallsWriter.Close ();
regCallsWriter.Close ();

var real_app_dir = Path.Combine (OutputDirectory, "src", "net", "dot", "android");
string applicationTemplateFile = "ApplicationRegistration.java";
SaveResource (
applicationTemplateFile,
applicationTemplateFile,
real_app_dir,
template => template.Replace ("// REGISTER_APPLICATION_AND_INSTRUMENTATION_CLASSES_HERE", regCallsWriter.ToString ())
);
var real_app_dir = Path.Combine (OutputDirectory, "src", "net", "dot", "android");
string applicationTemplateFile = "ApplicationRegistration.java";
SaveResource (
applicationTemplateFile,
applicationTemplateFile,
real_app_dir,
template => template.Replace ("// REGISTER_APPLICATION_AND_INSTRUMENTATION_CLASSES_HERE", regCallsWriter.ToString ())
);
}

}

Expand Down
10 changes: 4 additions & 6 deletions src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -206,12 +206,10 @@ internal static Dictionary<string, ITaskItem> MaybeGetArchAssemblies (Dictionary
var tdCache = new TypeDefinitionCache ();
(List<TypeDefinition> allJavaTypes, List<TypeDefinition> javaTypesForJCW) = ScanForJavaTypes (resolver, tdCache, assemblies, userAssemblies, useMarshalMethods);

MarshalMethodsCollection? marshalMethodsCollection = null;

if (useMarshalMethods)
marshalMethodsCollection = MarshalMethodsCollection.FromAssemblies (arch, assemblies.Values.ToList (), resolver, Log);

return new NativeCodeGenState (arch, tdCache, resolver, allJavaTypes, javaTypesForJCW, marshalMethodsCollection);
// Marshal method classification is now done in the inner build by
// RewriteMarshalMethods, so we never classify here. The NativeCodeGenState
// will have a null Classifier; downstream tasks must handle that.
return new NativeCodeGenState (arch, tdCache, resolver, allJavaTypes, javaTypesForJCW, classifier: null);
}

(List<TypeDefinition> allJavaTypes, List<TypeDefinition> javaTypesForJCW) ScanForJavaTypes (XAAssemblyResolver res, TypeDefinitionCache cache, Dictionary<string, ITaskItem> assemblies, Dictionary<string, ITaskItem> userAssemblies, bool useMarshalMethods)
Expand Down
Loading