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) +