Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
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
3 changes: 3 additions & 0 deletions samples/NativeAOT/MainActivity.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Android.Runtime;
using Android.Util;
using System.Reflection;
using System.Runtime.InteropServices;

Expand All @@ -10,6 +11,8 @@ public class MainActivity : Activity
{
protected override void OnCreate(Bundle? savedInstanceState)
{
Log.Debug ("NativeAOT", "MainActivity.OnCreate()");

base.OnCreate(savedInstanceState);

// Set our view from the "main" layout resource
Expand Down
22 changes: 22 additions & 0 deletions samples/NativeAOT/MainApplication.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Android.Runtime;
using Android.Util;

/// <summary>
/// NOTE: This class is not required, but used for testing Android.App.Application subclasses.
/// </summary>
[Register ("my/MainApplication")] // Required for typemap in NativeAotTypeManager
[Application]
public class MainApplication : Application
{
public MainApplication (IntPtr handle, JniHandleOwnership transfer)
: base (handle, transfer)
{
}

public override void OnCreate ()
{
Log.Debug ("NativeAOT", "Application.OnCreate()");

base.OnCreate ();
}
}
2 changes: 2 additions & 0 deletions samples/NativeAOT/NativeAotRuntimeProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ public boolean onCreate() {
public void attachInfo(android.content.Context context, android.content.pm.ProviderInfo info) {
Log.d(TAG, "NativeAotRuntimeProvider.attachInfo(): calling JavaInteropRuntime.init()…");
JavaInteropRuntime.init();
// NOTE: only required for custom applications
net.dot.jni.ApplicationRegistration.registerApplications();
super.attachInfo (context, info);
}

Expand Down
1 change: 1 addition & 0 deletions samples/NativeAOT/NativeAotTypeManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ partial class NativeAotTypeManager : JniRuntime.JniTypeManager {
["android/os/Bundle"] = typeof (Android.OS.Bundle),
["android/view/ContextThemeWrapper"] = typeof (Android.Views.ContextThemeWrapper),
["my/MainActivity"] = typeof (MainActivity),
["my/MainApplication"] = typeof (MainApplication),
};

public NativeAotTypeManager ()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ This file contains the NativeAOT-specific MSBuild logic for .NET for Android.
<!-- Default property values for NativeAOT -->
<PropertyGroup>
<_AndroidRuntimePackRuntime>NativeAOT</_AndroidRuntimePackRuntime>
<_AndroidCodeGenerationTarget Condition=" '$(_AndroidCodeGenerationTarget)' == '' ">JavaInterop1</_AndroidCodeGenerationTarget>
<!-- NativeAOT's targets currently gives an error about cross-compilation -->
<DisableUnsupportedError Condition=" $([MSBuild]::IsOSPlatform('windows')) and '$(DisableUnsupportedError)' == '' ">true</DisableUnsupportedError>
</PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package mono.android.app;
package net.dot.jni;

public class ApplicationRegistration {

Expand Down
39 changes: 23 additions & 16 deletions src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,14 +96,19 @@ public class GenerateJavaStubs : AndroidTask
[Required]
public string AndroidRuntime { get; set; } = "";

[Required]
public string CodeGenerationTarget { get; set; } = "";

AndroidRuntime androidRuntime;
JavaPeerStyle codeGenerationTarget;

internal const string AndroidSkipJavaStubGeneration = "AndroidSkipJavaStubGeneration";

public override bool RunTask ()
{
try {
androidRuntime = MonoAndroidHelper.ParseAndroidRuntime (AndroidRuntime);
codeGenerationTarget = MonoAndroidHelper.ParseCodeGenerationTarget (CodeGenerationTarget);
bool useMarshalMethods = !Debug && EnableMarshalMethods;
Run (useMarshalMethods);
} catch (XamarinAndroidException e) {
Expand Down Expand Up @@ -300,24 +305,24 @@ Dictionary<string, ITaskItem> MaybeGetArchAssemblies (Dictionary<AndroidTargetAr

void GenerateAdditionalProviderSources (NativeCodeGenState codeGenState, IList<string> additionalProviders)
{
if (androidRuntime != Xamarin.Android.Tasks.AndroidRuntime.MonoVM) {
bool isMonoVm = androidRuntime == Xamarin.Android.Tasks.AndroidRuntime.MonoVM;
if (!isMonoVm) {
Log.LogDebugMessage ($"Skipping MonoRuntimeProvider generation for: {androidRuntime}");
return;
}

// Create additional runtime provider java sources.
string providerTemplateFile = "MonoRuntimeProvider.Bundled.java";
string providerTemplate = GetResource (providerTemplateFile);

foreach (var provider in additionalProviders) {
var contents = providerTemplate.Replace ("MonoRuntimeProvider", provider);
var real_provider = Path.Combine (OutputDirectory, "src", "mono", provider + ".java");
Files.CopyIfStringChanged (contents, real_provider);
} else {
// Create additional runtime provider java sources.
string providerTemplateFile = "MonoRuntimeProvider.Bundled.java";
string providerTemplate = GetResource (providerTemplateFile);

foreach (var provider in additionalProviders) {
var contents = providerTemplate.Replace ("MonoRuntimeProvider", provider);
var real_provider = Path.Combine (OutputDirectory, "src", "mono", provider + ".java");
Files.CopyIfStringChanged (contents, real_provider);
}
}

// Create additional application java sources.
StringWriter regCallsWriter = new StringWriter ();
regCallsWriter.WriteLine ("\t\t// Application and Instrumentation ACWs must be registered first.");
regCallsWriter.WriteLine ("// Application and Instrumentation ACWs must be registered first.");
foreach (TypeDefinition type in codeGenState.JavaTypesForJCW) {
if (JavaNativeTypeManager.IsApplication (type, codeGenState.TypeCache) || JavaNativeTypeManager.IsInstrumentation (type, codeGenState.TypeCache)) {
if (codeGenState.Classifier != null && !codeGenState.Classifier.FoundDynamicallyRegisteredMethods (type)) {
Expand All @@ -326,15 +331,17 @@ void GenerateAdditionalProviderSources (NativeCodeGenState codeGenState, IList<s

string javaKey = JavaNativeTypeManager.ToJniName (type, codeGenState.TypeCache).Replace ('/', '.');
regCallsWriter.WriteLine (
"\t\tmono.android.Runtime.register (\"{0}\", {1}.class, {1}.__md_methods);",
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);",
type.GetAssemblyQualifiedName (codeGenState.TypeCache),
javaKey
);
}
}
regCallsWriter.Close ();

var real_app_dir = Path.Combine (OutputDirectory, "src", "mono", "android", "app");
var real_app_dir = Path.Combine (OutputDirectory, "src", "net", "dot", "jni");
string applicationTemplateFile = "ApplicationRegistration.java";
SaveResource (
applicationTemplateFile,
Expand Down Expand Up @@ -392,7 +399,7 @@ IList<string> MergeManifest (NativeCodeGenState codeGenState, Dictionary<string,
(List<TypeDefinition> allJavaTypes, List<TypeDefinition> javaTypesForJCW) = ScanForJavaTypes (resolver, tdCache, assemblies, userAssemblies, useMarshalMethods);
var jcwContext = new JCWGeneratorContext (arch, resolver, assemblies.Values, javaTypesForJCW, tdCache, useMarshalMethods);
var jcwGenerator = new JCWGenerator (Log, jcwContext) {
CodeGenerationTarget = androidRuntime == Xamarin.Android.Tasks.AndroidRuntime.MonoVM ? JavaPeerStyle.XAJavaInterop1 : JavaPeerStyle.JavaInterop1
CodeGenerationTarget = codeGenerationTarget,
};
bool success;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1093,12 +1093,12 @@ public void RemoveOldMonoPackageManager ()
};
var intermediate = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath);
var oldMonoPackageManager = Path.Combine (intermediate, "android", "src", "mono", "MonoPackageManager.java");
var notifyTimeZoneChanges = Path.Combine (intermediate, "android", "src", "mono", "android", "app", "NotifyTimeZoneChanges.java");
var notifyTimeZoneChanges = Path.Combine (intermediate, "android", "src", "net", "dot", "jni", "NotifyTimeZoneChanges.java");
Directory.CreateDirectory (Path.GetDirectoryName (notifyTimeZoneChanges));
File.WriteAllText (oldMonoPackageManager, @"package mono;
public class MonoPackageManager { }
class MonoPackageManager_Resources { }");
File.WriteAllText (notifyTimeZoneChanges, @"package mono.android.app;
File.WriteAllText (notifyTimeZoneChanges, @"package net.dot.jni;
public class ApplicationRegistration { }");
var oldMonoPackageManagerClass = Path.Combine (intermediate, "android", "bin", "classes" , "mono", "MonoPackageManager.class");
File.WriteAllText (oldMonoPackageManagerClass, "");
Expand Down
10 changes: 10 additions & 0 deletions src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using System.Threading;
using Xamarin.Android.Tools;
using Xamarin.Tools.Zip;
using Java.Interop.Tools.JavaCallableWrappers;

#if MSBUILD
using Microsoft.Android.Build.Tasks;
Expand Down Expand Up @@ -830,5 +831,14 @@ public static AndroidRuntime ParseAndroidRuntime (string androidRuntime)
// Default runtime is MonoVM
return AndroidRuntime.MonoVM;
}

public static JavaPeerStyle ParseCodeGenerationTarget (string codeGenerationTarget)
{
if (Enum.TryParse (codeGenerationTarget, ignoreCase: true, out JavaPeerStyle style))
return style;

// Default is XAJavaInterop1
return JavaPeerStyle.XAJavaInterop1;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1501,6 +1501,7 @@ because xbuild doesn't support framework reference assemblies.

<GenerateJavaStubs
AndroidRuntime="$(_AndroidRuntime)"
CodeGenerationTarget="$(_AndroidCodeGenerationTarget)"
ResolvedAssemblies="@(_ResolvedAssemblies)"
ResolvedUserAssemblies="@(_ResolvedUserMonoAndroidAssemblies)"
ErrorOnCustomJavaObject="$(AndroidErrorOnCustomJavaObject)"
Expand Down
2 changes: 1 addition & 1 deletion src/java-runtime/java-runtime.targets
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
/>
<!-- These files are auto generated at app build time so should be removed from the runtime.jar -->
<Delete Files="%(_RuntimeOutput.IntermediateRuntimeOutputPath)\mono\MonoPackageManager_Resources.class" />
<Delete Files="%(_RuntimeOutput.IntermediateRuntimeOutputPath)\mono\android\app\ApplicationRegistration.class" />
<Delete Files="%(_RuntimeOutput.IntermediateRuntimeOutputPath)\net\dot\jni\ApplicationRegistration.class" />
<Delete Files="%(_RuntimeOutput.IntermediateRuntimeOutputPath)\mono\android\app\XamarinAndroidEnvironmentVariables.class" />
<Exec
Condition="Exists('%(_RuntimeOutput.OutputJar)')"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ public static void LoadApplication (Context context)
haveSplitApks
);

mono.android.app.ApplicationRegistration.registerApplications ();
net.dot.jni.ApplicationRegistration.registerApplications ();

initialized = true;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package mono.android.app;
package net.dot.jni;

public class ApplicationRegistration {

Expand Down
Loading