diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.Adapters/CecilImporter.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.Adapters/CecilImporter.cs
index 9353e8378..06aefbc57 100644
--- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.Adapters/CecilImporter.cs
+++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.Adapters/CecilImporter.cs
@@ -269,7 +269,7 @@ static CallableWrapperMethod CreateMethod (MethodDefinition methodDefinition, Ca
static CallableWrapperMethod CreateMethod (string name, CallableWrapperType declaringType, string? signature, string? connector, string? managedParameters, string? outerType, string? superCall)
{
signature = signature ?? throw new ArgumentNullException ("`connector` cannot be null.", nameof (connector));
- var method_name = "n_" + name + ":" + signature + ":" + connector;
+ var method_name = "n_" + name + ":" + signature + ":" + connector?.Replace ('/', '+');
var method = new CallableWrapperMethod (declaringType, name, method_name, signature);
diff --git a/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs b/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs
index 6967f9579..8e5d6b0ec 100644
--- a/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs
+++ b/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs
@@ -150,7 +150,7 @@ static string ToCliTypePart (string part)
for (int i = 0; i < parts.Length; ++i) {
parts [i] = ToPascalCase (parts [i], 1);
}
- return string.Join ("/", parts);
+ return string.Join ("+", parts);
}
static string ToPascalCase (string value, int minLength)
diff --git a/tests/Java.Interop.Export-Tests/Java.Interop.Export-Tests.csproj b/tests/Java.Interop.Export-Tests/Java.Interop.Export-Tests.csproj
index 62edf36f6..b198a6511 100644
--- a/tests/Java.Interop.Export-Tests/Java.Interop.Export-Tests.csproj
+++ b/tests/Java.Interop.Export-Tests/Java.Interop.Export-Tests.csproj
@@ -26,6 +26,10 @@
+
diff --git a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs
index 04e1f6049..1f4fcd558 100644
--- a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs
+++ b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs
@@ -104,6 +104,55 @@ public void monodroidClearReferences ()
Assert.AreEqual (expected, actual);
}
+ [Test]
+ public void GenerateTypeMentioningNestedInvoker ()
+ {
+ var actual = Generate (typeof (ApplicationName.ActivityLifecycleCallbacks));
+ var expected = """
+package application;
+
+
+public class Name_ActivityLifecycleCallbacks
+ extends java.lang.Object
+ implements
+ mono.android.IGCUserPeer,
+ java.lang.Object
+{
+/** @hide */
+ public static final String __md_methods;
+ static {
+ __md_methods =
+ "n_onActivityCreated:(Landroid/app/Activity;Landroid/os/Bundle;)V:GetOnActivityCreated_Landroid_app_Activity_Landroid_os_Bundle_Handler:Android.App.Application+IActivityLifecycleCallbacksInvoker, Mono.Android\n" +
+ "";
+ mono.android.Runtime.register ("Xamarin.Android.ToolsTests.ApplicationName+ActivityLifecycleCallbacks, Java.Interop.Tools.JavaCallableWrappers-Tests", Name_ActivityLifecycleCallbacks.class, __md_methods);
+ }
+
+ public void onActivityCreated (android.app.Activity p0, android.os.Bundle p1)
+ {
+ n_onActivityCreated (p0, p1);
+ }
+
+ private native void n_onActivityCreated (android.app.Activity p0, android.os.Bundle p1);
+
+ private java.util.ArrayList refList;
+ public void monodroidAddReference (java.lang.Object obj)
+ {
+ if (refList == null)
+ refList = new java.util.ArrayList ();
+ refList.add (obj);
+ }
+
+ public void monodroidClearReferences ()
+ {
+ if (refList != null)
+ refList.clear ();
+ }
+}
+
+""";
+ Assert.AreEqual (expected, actual);
+ }
+
static string Generate (Type type, string applicationJavaClass = null, string monoRuntimeInit = null, JavaPeerStyle style = JavaPeerStyle.XAJavaInterop1)
{
var reader_options = new CallableWrapperReaderOptions {
diff --git a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs
index 0a56b225c..134c2e04a 100644
--- a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs
+++ b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs
@@ -22,6 +22,26 @@ class Application : Java.Lang.Object
protected virtual void OnCreate ()
{
}
+
+ [Register ("android/app/Application$ActivityLifecycleCallbacks", DoNotGenerateAcw = true)]
+ public partial interface IActivityLifecycleCallbacks {
+ [Register (
+ name: "onActivityCreated",
+ signature: "(Landroid/app/Activity;Landroid/os/Bundle;)V",
+ connector: "GetOnActivityCreated_Landroid_app_Activity_Landroid_os_Bundle_Handler:Android.App.Application/IActivityLifecycleCallbacksInvoker, Mono.Android")]
+ void OnActivityCreated (Android.App.Activity activity, global::Android.OS.Bundle savedInstanceState);
+ }
+
+ internal class IActivityLifecycleCallbacksInvoker : Java.Lang.Object, IActivityLifecycleCallbacks {
+ static Delegate GetOnActivityCreated_Landroid_app_Activity_Landroid_os_Bundle_Handler ()
+ {
+ return null;
+ }
+
+ public void OnActivityCreated (Android.App.Activity activity, global::Android.OS.Bundle savedInstanceState)
+ {
+ }
+ }
}
[Register ("android/app/Activity", DoNotGenerateAcw = true)]
@@ -43,6 +63,14 @@ public virtual void OnCreate (Java.Lang.Object arguments)
}
}
+namespace Android.OS {
+
+ [Register ("android/os/Bundle", DoNotGenerateAcw = true)]
+ class Bundle : Java.Lang.Object
+ {
+ }
+}
+
namespace Android.Runtime {
interface IJavaObject
@@ -72,6 +100,7 @@ static class SupportDeclarations
typeof (AbstractClass),
typeof (ActivityName),
typeof (ApplicationName),
+ typeof (ApplicationName.ActivityLifecycleCallbacks),
typeof (DefaultName),
typeof (DefaultName.A),
typeof (DefaultName.A.B),
@@ -139,6 +168,12 @@ class ActivityName : Java.Lang.Object
[Application (Name = "application.Name")]
class ApplicationName : Application
{
+ public class ActivityLifecycleCallbacks : Java.Lang.Object, Application.IActivityLifecycleCallbacks
+ {
+ public void OnActivityCreated (Activity activity, global::Android.OS.Bundle savedInstanceState)
+ {
+ }
+ }
}
class IndirectApplication : ApplicationName
diff --git a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs
index 3c7ee7686..d20039894 100644
--- a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs
+++ b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs
@@ -50,7 +50,7 @@ public void WriteJavaToManaged ()
v.WriteJavaToManaged (o);
var a = ToArray (o);
Save (a, "__j2m");
- var length = 190;
+ var length = 193;
var offset = 76;
var e =
"version=1\u0000" +
@@ -59,6 +59,7 @@ public void WriteJavaToManaged ()
"value-offset=" + offset + "\u0000" +
GetJ2MEntryLine (typeof (ActivityName), "activity/Name", offset, length) +
GetJ2MEntryLine (typeof (ApplicationName), "application/Name", offset, length) +
+ GetJ2MEntryLine (typeof (ApplicationName.ActivityLifecycleCallbacks), "application/Name_ActivityLifecycleCallbacks", offset, length) +
GetJ2MEntryLine (typeof (DefaultName), "crc64197ae30a36756915/DefaultName", offset, length) +
GetJ2MEntryLine (typeof (DefaultName.A), "crc64197ae30a36756915/DefaultName_A", offset, length) +
GetJ2MEntryLine (typeof (DefaultName.A.B), "crc64197ae30a36756915/DefaultName_A_B", offset, length) +
@@ -128,8 +129,8 @@ public void WriteManagedToJava ()
v.WriteManagedToJava (o);
var a = ToArray (o);
Save (a, "__m2j");
- var length = 190;
- var offset = 114;
+ var length = 193;
+ var offset = 117;
var e =
"version=1\u0000" +
$"entry-count={types.Count}\u0000" +
@@ -138,6 +139,7 @@ public void WriteManagedToJava ()
GetM2JEntryLine (typeof (AbstractClass), "my/AbstractClass", offset, length) +
GetM2JEntryLine (typeof (AbstractClassInvoker), "my/AbstractClass", offset, length) +
GetM2JEntryLine (typeof (ActivityName), "activity/Name", offset, length) +
+ GetM2JEntryLine (typeof (ApplicationName.ActivityLifecycleCallbacks), "application/Name_ActivityLifecycleCallbacks", offset, length) +
GetM2JEntryLine (typeof (ApplicationName), "application/Name", offset, length) +
GetM2JEntryLine (typeof (DefaultName.A.B), "crc64197ae30a36756915/DefaultName_A_B", offset, length) +
GetM2JEntryLine (typeof (DefaultName.A), "crc64197ae30a36756915/DefaultName_A", offset, length) +
diff --git a/tools/generator/Java.Interop.Tools.Generator.ObjectModel/ClassGen.cs b/tools/generator/Java.Interop.Tools.Generator.ObjectModel/ClassGen.cs
index 0514123bf..83893e50a 100644
--- a/tools/generator/Java.Interop.Tools.Generator.ObjectModel/ClassGen.cs
+++ b/tools/generator/Java.Interop.Tools.Generator.ObjectModel/ClassGen.cs
@@ -181,7 +181,7 @@ public static void GenerateTypeRegistrations (CodeGenerationOptions opt, Generat
int ls = reg.Key.LastIndexOf ('/');
string package = ls >= 0 ? reg.Key.Substring (0, ls) : "";
- if (JavaNativeTypeManager.ToCliType (reg.Key) == reg.Value)
+ if (JavaNativeTypeManager.ToCliType (reg.Key) == reg.Value.Replace ('/', '+'))
continue;
if (!mapping.TryGetValue (package, out var v))
mapping.Add (package, v = new List> ());