From d8307f833b774bb1809aa871bbed43e83b55b48c Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Mon, 16 May 2022 13:26:44 +0200 Subject: [PATCH] Collect overridden Java methods in JCW Marshal methods generator in Xamarin.Android needs to know which Java methods in which types are overridden by the application. Package name, method name and signature are all require to generate correct name of the native symbol which will be found by JNI at the run time. --- .../JavaCallableWrapperGenerator.cs | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs index bcd073bdc..9bbc997ef 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs @@ -25,6 +25,36 @@ public enum JavaPeerStyle { JavaInterop1, } + public class OverriddenMethodDescriptor + { + static readonly char[] methodDescSplitChars = new char[] { ':' }; + + public string JavaPackageName { get; } + public string NativeName { get; } + public string JniSignature { get; } + public string Connector { get; } + public string ManagedTypeName { get; } + + public OverriddenMethodDescriptor (string javaPackageName, string methodDescription) + { + JavaPackageName = javaPackageName; + string[] parts = methodDescription.Split (methodDescSplitChars, 4); + + if (parts.Length < 2) { + throw new InvalidOperationException ($"Unexpected format for method description. Expected at least 2 parts, got {parts.Length} from: '{methodDescription}'"); + } + + NativeName = parts[0]; + JniSignature = parts[1]; + if (parts.Length > 2) { + Connector = parts[2]; + if (parts.Length > 3) { + ManagedTypeName = parts[3]; + } + } + } + } + public class JavaCallableWrapperGenerator { class JavaFieldInfo { @@ -59,6 +89,7 @@ public string GetJavaAccess () List methods = new List (); List ctors = new List (); List children; + List overriddenMethodDescriptors; readonly IMetadataResolver cache; [Obsolete ("Use the TypeDefinitionCache overload for better performance.")] @@ -80,6 +111,7 @@ public JavaCallableWrapperGenerator (TypeDefinition type, Action OverriddenMethodDescriptors => overriddenMethodDescriptors; public string ApplicationJavaClass { get; set; } public JavaPeerStyle CodeGenerationTarget { get; set; } @@ -89,7 +121,7 @@ public JavaCallableWrapperGenerator (TypeDefinition type, Action /// The Java source code to be included in Instrumentation.onCreate - /// + /// /// Originally came from MonoRuntimeProvider.java delimited by: /// // Mono Runtime Initialization {{{ /// // }}} @@ -497,6 +529,7 @@ string GetManagedParameters (MethodDefinition ctor, string outerType) public void Generate (TextWriter writer) { + overriddenMethodDescriptors = new List (); if (!string.IsNullOrEmpty (package)) { writer.WriteLine ("package " + package + ";"); writer.WriteLine (); @@ -530,6 +563,17 @@ public void Generate (TextWriter writer) } GenerateFooter (writer); + + string javaTypeName = $"{package}.{name}"; + AddOverridenMethods (methods); + AddOverridenMethods (ctors); + + void AddOverridenMethods (List list) + { + foreach (Signature sig in list) { + overriddenMethodDescriptors.Add (new OverriddenMethodDescriptor (javaTypeName, sig.Method)); + } + } } public void Generate (string outputPath) @@ -958,5 +1002,3 @@ public string GetDestinationPath (string outputPath) } } } - -