diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.csproj b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.csproj index 13982723f..c19418010 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.csproj +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.csproj @@ -56,14 +56,6 @@ Xamarin.Android.Cecil - - - MonoRuntimeProvider.Bundled.java - - - MonoRuntimeProvider.Shared.java - - 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 ccb1fcfff..6f9fa1f1c 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 @@ -65,12 +65,19 @@ 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 {{{ + /// // }}} + /// + public string MonoRuntimeInitialization { get; set; } + public string Name { get { return name; } } @@ -837,21 +844,9 @@ void WriteInstrumentationOnCreate (TextWriter sw, Action extra) sw.WriteLine ("\t\tandroid.content.Context context = getContext ();"); sw.WriteLine (); - using (var app = new StreamReader ( - Assembly.GetExecutingAssembly ().GetManifestResourceStream ( - UseSharedRuntime - ? "MonoRuntimeProvider.Shared.java" - : "MonoRuntimeProvider.Bundled.java"))) { - bool copy = false; - string line; - while ((line = app.ReadLine ()) != null) { - if (string.CompareOrdinal ("\t\t// Mono Runtime Initialization {{{", line) == 0) - copy = true; - if (copy) - sw.WriteLine (line); - if (string.CompareOrdinal ("\t\t// }}}", line) == 0) - copy = false; - } + if (!string.IsNullOrEmpty (MonoRuntimeInitialization)) { + sw.WriteLine (MonoRuntimeInitialization); + sw.WriteLine (); } extra (sw); diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Resources/MonoRuntimeProvider.Bundled.java b/src/Java.Interop.Tools.JavaCallableWrappers/Resources/MonoRuntimeProvider.Bundled.java deleted file mode 100644 index 354330774..000000000 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Resources/MonoRuntimeProvider.Bundled.java +++ /dev/null @@ -1,57 +0,0 @@ -package mono; - -import android.util.Log; - -public class MonoRuntimeProvider - extends android.content.ContentProvider -{ - public MonoRuntimeProvider () - { - } - - @Override - public boolean onCreate () - { - return true; - } - - @Override - public void attachInfo (android.content.Context context, android.content.pm.ProviderInfo info) - { - // Mono Runtime Initialization {{{ - mono.MonoPackageManager.LoadApplication (context, context.getApplicationInfo (), new String[]{context.getApplicationInfo ().sourceDir}); - // }}} - super.attachInfo (context, info); - } - - @Override - public android.database.Cursor query (android.net.Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public String getType (android.net.Uri uri) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public android.net.Uri insert (android.net.Uri uri, android.content.ContentValues initialValues) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public int delete (android.net.Uri uri, String where, String[] whereArgs) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public int update (android.net.Uri uri, android.content.ContentValues values, String where, String[] whereArgs) - { - throw new RuntimeException ("This operation is not supported."); - } -} - diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Resources/MonoRuntimeProvider.Shared.java b/src/Java.Interop.Tools.JavaCallableWrappers/Resources/MonoRuntimeProvider.Shared.java deleted file mode 100644 index c0060066d..000000000 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Resources/MonoRuntimeProvider.Shared.java +++ /dev/null @@ -1,83 +0,0 @@ -package mono; - -public class MonoRuntimeProvider - extends android.content.ContentProvider -{ - public MonoRuntimeProvider () - { - } - - @Override - public boolean onCreate () - { - return true; - } - - @Override - public void attachInfo (android.content.Context context, android.content.pm.ProviderInfo info) - { - // Mono Runtime Initialization {{{ - android.content.pm.ApplicationInfo apiInfo = null; - - String platformPackage = mono.MonoPackageManager.getApiPackageName (); - if (platformPackage != null) { - Throwable t = null; - try { - apiInfo = context.getPackageManager ().getApplicationInfo (platformPackage, 0); - } catch (android.content.pm.PackageManager.NameNotFoundException e) { - // ignore - } - if (apiInfo == null) { - try { - apiInfo = context.getPackageManager ().getApplicationInfo ("Xamarin.Android.Platform", 0); - } catch (android.content.pm.PackageManager.NameNotFoundException e) { - t = e; - } - } - if (apiInfo == null) - throw new RuntimeException ("Unable to find application " + platformPackage + " or Xamarin.Android.Platform!", t); - } - try { - android.content.pm.ApplicationInfo runtimeInfo = context.getPackageManager ().getApplicationInfo ("Mono.Android.DebugRuntime", 0); - mono.MonoPackageManager.LoadApplication (context, runtimeInfo, - apiInfo != null - ? new String[]{runtimeInfo.sourceDir, apiInfo.sourceDir, context.getApplicationInfo ().sourceDir} - : new String[]{runtimeInfo.sourceDir, context.getApplicationInfo ().sourceDir}); - } catch (android.content.pm.PackageManager.NameNotFoundException e) { - throw new RuntimeException ("Unable to find application Mono.Android.DebugRuntime!", e); - } - // }}} - super.attachInfo (context, info); - } - - @Override - public android.database.Cursor query (android.net.Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public String getType (android.net.Uri uri) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public android.net.Uri insert (android.net.Uri uri, android.content.ContentValues initialValues) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public int delete (android.net.Uri uri, String where, String[] whereArgs) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public int update (android.net.Uri uri, android.content.ContentValues values, String where, String[] whereArgs) - { - throw new RuntimeException ("This operation is not supported."); - } -} - diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs index b3a9194e5..6a1a5ab34 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs @@ -56,6 +56,12 @@ public Name () mono.MonoPackageManager.setContext (this); }} + public void onCreate () + {{ + mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ApplicationName, Java.Interop.Tools.JavaCallableWrappers-Tests"", Name.class, __md_methods); + super.onCreate (); + }} + private java.util.ArrayList refList; public void monodroidAddReference (java.lang.Object obj) {{ @@ -74,11 +80,13 @@ public void monodroidClearReferences () Assert.AreEqual (expected, actual); } - static string Generate (Type type, string applicationJavaClass = null) + static string Generate (Type type, string applicationJavaClass = null, string monoRuntimeInit = null) { var td = SupportDeclarations.GetTypeDefinition (type); var g = new JavaCallableWrapperGenerator (td, null) { ApplicationJavaClass = applicationJavaClass, + GenerateOnCreateOverrides = true, + MonoRuntimeInitialization = monoRuntimeInit, }; var o = new StringWriter (); var dir = Path.GetDirectoryName (typeof (JavaCallableWrapperGeneratorTests).Assembly.Location); @@ -488,6 +496,92 @@ public void monodroidClearReferences () refList.clear (); } } +"; + Assert.AreEqual (expected, actual); + } + + [Test] + public void GenerateActivity () + { + var actual = Generate (typeof (ExampleActivity)); + var expected = @"package my; + + +public class ExampleActivity + extends android.app.Activity + implements + mono.android.IGCUserPeer +{ +/** @hide */ + public static final String __md_methods; + static { + __md_methods = + """"; + mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExampleActivity, Java.Interop.Tools.JavaCallableWrappers-Tests"", ExampleActivity.class, __md_methods); + } + + 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); + } + + [Test] + public void GenerateInstrumentation () + { + var init = "mono.MonoPackageManager.LoadApplication (context, context.getApplicationInfo (), new String[]{context.getApplicationInfo ().sourceDir});"; + var actual = Generate (typeof (ExampleInstrumentation), monoRuntimeInit: init); + var expected = $@"package my; + + +public class ExampleInstrumentation + extends android.app.Instrumentation + implements + mono.android.IGCUserPeer +{{ +/** @hide */ + public static final String __md_methods; + static {{ + __md_methods = + """"; + }} + + public void onCreate (android.os.Bundle arguments) + {{ + android.content.Context context = getContext (); + +{init} + + mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExampleInstrumentation, Java.Interop.Tools.JavaCallableWrappers-Tests"", ExampleInstrumentation.class, __md_methods); + super.onCreate (arguments); + }} + + 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); } diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs index 4ef578456..341b62a34 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs @@ -23,6 +23,24 @@ protected virtual void OnCreate () { } } + + [Register ("android/app/Activity", DoNotGenerateAcw = true)] + class Activity : Java.Lang.Object + { + [Register ("onCreate", "(Ljava/lang/Object;)V", "Activity.OnCreate")] + public virtual void OnCreate (Java.Lang.Object savedInstanceState) + { + } + } + + [Register ("android/app/Instrumentation", DoNotGenerateAcw = true)] + class Instrumentation : Java.Lang.Object + { + [Register ("onCreate", "(Ljava/lang/Object;)V", "Instrumentation.OnCreate")] + public virtual void OnCreate (Java.Lang.Object arguments) + { + } + } } namespace Android.Runtime { @@ -58,6 +76,8 @@ static class SupportDeclarations typeof (DefaultName.A), typeof (DefaultName.A.B), typeof (DefaultName.C.D), + typeof (ExampleActivity), + typeof (ExampleInstrumentation), typeof (ExampleOuterClass), typeof (ExampleOuterClass.ExampleInnerClass), typeof (InstrumentationName), @@ -179,6 +199,16 @@ public ExampleInnerClass (ExampleOuterClass outer) } } + [Activity (Name = "my.ExampleActivity")] + class ExampleActivity : Activity + { + } + + [Instrumentation (Name = "my.ExampleInstrumentation")] + class ExampleInstrumentation : Instrumentation + { + } + [BroadcastReceiver (Name = "receiver.Name")] class ReceiverName : Java.Lang.Object { diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs index 0e694b5fc..99ec63fb0 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs @@ -44,7 +44,8 @@ public void ConstructorExceptions () [Test] public void WriteJavaToManaged () { - var v = new TypeNameMapGenerator (SupportDeclarations.GetTestTypeDefinitions (), logger: Diagnostic.CreateConsoleLogger ()); + var types = SupportDeclarations.GetTestTypeDefinitions (); + var v = new TypeNameMapGenerator (types, logger: Diagnostic.CreateConsoleLogger ()); var o = new MemoryStream (); v.WriteJavaToManaged (o); var a = ToArray (o); @@ -53,7 +54,7 @@ public void WriteJavaToManaged () var offset = 90; var e = "version=1\u0000" + - "entry-count=18\u0000" + + $"entry-count={types.Count - 1}\u0000" + "entry-len=" + length + "\u0000" + "value-offset=" + offset + "\u0000" + GetJ2MEntryLine (typeof (ActivityName), "activity/Name", offset, length) + @@ -66,6 +67,8 @@ public void WriteJavaToManaged () GetJ2MEntryLine (typeof (ExampleOuterClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass", offset, length) + GetJ2MEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) + GetJ2MEntryLine (typeof (AbstractClass), "my/AbstractClass", offset, length) + + GetJ2MEntryLine (typeof (ExampleActivity), "my/ExampleActivity", offset, length) + + GetJ2MEntryLine (typeof (ExampleInstrumentation), "my/ExampleInstrumentation", offset, length) + GetJ2MEntryLine (typeof (ProviderName), "provider/Name", offset, length) + GetJ2MEntryLine (typeof (ReceiverName), "receiver/Name", offset, length) + GetJ2MEntryLine (typeof (RegisterName), "register/Name", offset, length) + @@ -119,7 +122,8 @@ public void WriteManagedToJavaWithNoTypes () [Test] public void WriteManagedToJava () { - var v = new TypeNameMapGenerator (SupportDeclarations.GetTestTypeDefinitions (), logger: Diagnostic.CreateConsoleLogger ()); + var types = SupportDeclarations.GetTestTypeDefinitions (); + var v = new TypeNameMapGenerator (types, logger: Diagnostic.CreateConsoleLogger ()); var o = new MemoryStream (); v.WriteManagedToJava (o); var a = ToArray (o); @@ -128,7 +132,7 @@ public void WriteManagedToJava () var offset = 114; var e = "version=1\u0000" + - "entry-count=19\u0000" + + $"entry-count={types.Count}\u0000" + "entry-len=" + length + "\u0000" + "value-offset=" + offset + "\u0000" + GetM2JEntryLine (typeof (AbstractClass), "my/AbstractClass", offset, length) + @@ -139,6 +143,8 @@ public void WriteManagedToJava () GetM2JEntryLine (typeof (DefaultName.A), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A", offset, length) + GetM2JEntryLine (typeof (DefaultName.C.D), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_C_D", offset, length) + GetM2JEntryLine (typeof (DefaultName), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName", offset, length) + + GetM2JEntryLine (typeof (ExampleActivity), "my/ExampleActivity", offset, length) + + GetM2JEntryLine (typeof (ExampleInstrumentation), "my/ExampleInstrumentation", offset, length) + GetM2JEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) + GetM2JEntryLine (typeof (ExampleOuterClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass", offset, length) + GetM2JEntryLine (typeof (InstrumentationName), "instrumentation/Name", offset, length) +