diff --git a/build-tools/scripts/JavaInteropDllConfigs.targets b/build-tools/scripts/JavaInteropDllConfigs.targets new file mode 100644 index 00000000000..7be6a690ee4 --- /dev/null +++ b/build-tools/scripts/JavaInteropDllConfigs.targets @@ -0,0 +1,26 @@ + + + + + + + + + + <_DllMaps>@(_JavaInteropDllMapContent->'%(Identity)', '%0a ') + + + + diff --git a/build-tools/scripts/RunTests.targets b/build-tools/scripts/RunTests.targets index e1f487aa5b4..99cbd0c74b8 100644 --- a/build-tools/scripts/RunTests.targets +++ b/build-tools/scripts/RunTests.targets @@ -147,10 +147,10 @@ <_RunParallelTestTarget Include="RunNUnitTests" /> - <_RunParallelTestTarget Include="RunJavaInteropTests" /> <_RunParallelTestTarget Include="RunApkTests" /> + <_RunTestTarget Include="RunJavaInteropTests" /> <_RunTestTarget Include="RunPerformanceTests" /> diff --git a/external/Java.Interop b/external/Java.Interop index 8ee34a353f3..ec2813acd69 160000 --- a/external/Java.Interop +++ b/external/Java.Interop @@ -1 +1 @@ -Subproject commit 8ee34a353f35021e8639bec3c4b64415462e8b43 +Subproject commit ec2813acd69b0a7cc35a1eee5a1f2ee10a57dfff diff --git a/src/Mono.Android/Android.Graphics/Color.cs b/src/Mono.Android/Android.Graphics/Color.cs index 698b28a5c18..b31b454fd14 100644 --- a/src/Mono.Android/Android.Graphics/Color.cs +++ b/src/Mono.Android/Android.Graphics/Color.cs @@ -1,12 +1,18 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; +using System.Reflection; using System.Text; using Android.Runtime; +using Java.Interop; +using Java.Interop.Expressions; + namespace Android.Graphics { + [JniValueMarshaler (typeof (ColorValueMarshaler))] public struct Color { private int color; @@ -386,4 +392,50 @@ public static void RGBToHSV (int red, int green, int blue, float[] hsv) public static Color YellowGreen { get { return new Color (0xFF9ACD32); } } #endregion } + + public class ColorValueMarshaler : JniValueMarshaler + { + public override Type MarshalType { + get { return typeof (int); } + } + + public override Color CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type targetType) + { + throw new NotImplementedException (); + } + + public override JniValueMarshalerState CreateGenericObjectReferenceArgumentState (Color value, ParameterAttributes synchronize) + { + throw new NotImplementedException (); + } + + public override void DestroyGenericArgumentState (Color value, ref JniValueMarshalerState state, ParameterAttributes synchronize) + { + throw new NotImplementedException (); + } + + public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize, Type targetType) + { + var c = typeof (Color).GetConstructor (new[]{typeof (int)}); + var v = Expression.Variable (typeof (Color), sourceValue.Name + "_val"); + context.LocalVariables.Add (v); + context.CreationStatements.Add (Expression.Assign (v, Expression.New (c, sourceValue))); + + return v; + } + + public override Expression CreateParameterFromManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize) + { + var r = Expression.Variable (MarshalType, sourceValue.Name + "_p"); + context.LocalVariables.Add (r); + context.CreationStatements.Add (Expression.Assign (r, Expression.Field (sourceValue, "color"))); + + return r; + } + + public override Expression CreateReturnValueFromManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue) + { + return CreateParameterFromManagedExpression (context, sourceValue, 0); + } + } } diff --git a/src/Mono.Android/Android.Runtime/AndroidRuntime.cs b/src/Mono.Android/Android.Runtime/AndroidRuntime.cs index 8cb36d23360..3767a08d64f 100644 --- a/src/Mono.Android/Android.Runtime/AndroidRuntime.cs +++ b/src/Mono.Android/Android.Runtime/AndroidRuntime.cs @@ -363,12 +363,10 @@ public override void WaitForGCBridgeProcessing () public override void AddPeer (IJavaPeerable value) { - throw new NotImplementedException (); } public override void RemovePeer (IJavaPeerable value) { - throw new NotImplementedException (); } public override IJavaPeerable PeekPeer (JniObjectReference reference) @@ -378,17 +376,15 @@ public override IJavaPeerable PeekPeer (JniObjectReference reference) public override void CollectPeers () { - throw new NotImplementedException (); } public override void FinalizePeer (IJavaPeerable value) { - throw new NotImplementedException (); } public override List GetSurfacedPeers () { - throw new NotImplementedException (); + return null; } } } diff --git a/src/Mono.Android/Android.Runtime/IJavaObject.cs b/src/Mono.Android/Android.Runtime/IJavaObject.cs index 3a1154de82d..a3ea6f0a076 100644 --- a/src/Mono.Android/Android.Runtime/IJavaObject.cs +++ b/src/Mono.Android/Android.Runtime/IJavaObject.cs @@ -2,6 +2,7 @@ namespace Android.Runtime { + [Java.Interop.JniValueMarshaler (typeof (IJavaObjectValueMarshaler))] public interface IJavaObject : IDisposable { IntPtr Handle { get; } } diff --git a/src/Mono.Android/Android.Runtime/IJavaObjectValueMarshaler.cs b/src/Mono.Android/Android.Runtime/IJavaObjectValueMarshaler.cs new file mode 100644 index 00000000000..bf73dbd05a9 --- /dev/null +++ b/src/Mono.Android/Android.Runtime/IJavaObjectValueMarshaler.cs @@ -0,0 +1,54 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +using Java.Interop; +using Java.Interop.Expressions; + +namespace Android.Runtime +{ + sealed class IJavaObjectValueMarshaler : JniValueMarshaler { + + internal static IJavaObjectValueMarshaler Instance = new IJavaObjectValueMarshaler (); + + public override IJavaObject CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type targetType) + { + throw new NotImplementedException (); + } + + public override JniValueMarshalerState CreateGenericObjectReferenceArgumentState (IJavaObject value, ParameterAttributes synchronize) + { + throw new NotImplementedException (); + } + + public override void DestroyGenericArgumentState (IJavaObject value, ref JniValueMarshalerState state, ParameterAttributes synchronize) + { + throw new NotImplementedException (); + } + + public override Expression CreateReturnValueFromManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue) + { + return Expression.Call ( + typeof (JNIEnv), + "ToLocalJniHandle", + null, + sourceValue); + } + + public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize, Type targetType) + { + var r = Expression.Variable (targetType, sourceValue.Name + "_val"); + context.LocalVariables.Add (r); + context.CreationStatements.Add ( + Expression.Assign (r, + Expression.Call ( + typeof (JavaConvert), + "FromJniHandle", + new[]{targetType}, + sourceValue, + Expression.Field (null, typeof (JniHandleOwnership), "DoNotTransfer")))); + return r; + } + } +} diff --git a/src/Mono.Android/Mono.Android.csproj b/src/Mono.Android/Mono.Android.csproj index 9e43a2a5c95..2aa386c6827 100644 --- a/src/Mono.Android/Mono.Android.csproj +++ b/src/Mono.Android/Mono.Android.csproj @@ -83,6 +83,7 @@ JavaNativeTypeManager.cs + diff --git a/src/Mono.Android/Test/Mono.Android-Tests.csproj b/src/Mono.Android/Test/Mono.Android-Tests.csproj index 8790afab08e..46fb57dc866 100644 --- a/src/Mono.Android/Test/Mono.Android-Tests.csproj +++ b/src/Mono.Android/Test/Mono.Android-Tests.csproj @@ -43,6 +43,7 @@ false true r8 + True diff --git a/src/Mono.Android/Test/Mono.Android-Tests.targets b/src/Mono.Android/Test/Mono.Android-Tests.targets index 3deadce4d45..107163fab3a 100644 --- a/src/Mono.Android/Test/Mono.Android-Tests.targets +++ b/src/Mono.Android/Test/Mono.Android-Tests.targets @@ -8,6 +8,7 @@ + + + diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs index 5492234f690..941547548cc 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs @@ -30,6 +30,7 @@ using Microsoft.Build.Utilities; using System; using System.IO; +using System.Linq; namespace Xamarin.Android.Tasks { @@ -49,6 +50,9 @@ public class ResolveSdks : Task [Output] public string JavaSdkPath { get; set; } + [Output] + public string JdkJvmPath { get; set; } + [Output] public string MonoAndroidToolsPath { get; set; } @@ -92,12 +96,38 @@ public override bool Execute () return false; } + try { + Log.LogDebugMessage ($"JavaSdkPath: {JavaSdkPath}"); + Xamarin.Android.Tools.JdkInfo info = null; + try { + info = new Xamarin.Android.Tools.JdkInfo (JavaSdkPath); + } catch { + info = Xamarin.Android.Tools.JdkInfo.GetKnownSystemJdkInfos (this.CreateTaskLogger ()).FirstOrDefault (); + } + + JdkJvmPath = info.JdkJvmPath; + + if (string.IsNullOrEmpty (JdkJvmPath)) { + Log.LogCodedError ("XA5300", $"{nameof (JdkJvmPath)} is blank"); + return false; + } + + if (!File.Exists (JdkJvmPath)) { + Log.LogCodedError ("XA5300", $"JdkJvmPath not found at {JdkJvmPath}"); + return false; + } + } catch (Exception e) { + Log.LogCodedError ("XA5300", $"Unable to find {nameof (JdkJvmPath)}{Environment.NewLine}{e}"); + return false; + } + MonoAndroidHelper.TargetFrameworkDirectories = ReferenceAssemblyPaths; Log.LogDebugMessage ($"{nameof (ResolveSdks)} Outputs:"); Log.LogDebugMessage ($" {nameof (AndroidSdkPath)}: {AndroidSdkPath}"); Log.LogDebugMessage ($" {nameof (AndroidNdkPath)}: {AndroidNdkPath}"); Log.LogDebugMessage ($" {nameof (JavaSdkPath)}: {JavaSdkPath}"); + Log.LogDebugMessage ($" {nameof (JdkJvmPath)}: {JdkJvmPath}"); Log.LogDebugMessage ($" {nameof (MonoAndroidBinPath)}: {MonoAndroidBinPath}"); Log.LogDebugMessage ($" {nameof (MonoAndroidToolsPath)}: {MonoAndroidToolsPath}"); diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 2da8db85a11..b7e41fa41df 100755 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -710,6 +710,7 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved. + @@ -1172,6 +1173,7 @@ because xbuild doesn't support framework reference assemblies. <_AndroidResgenFlagFile>$(IntermediateOutputPath)R.cs.flag <_AndroidResFlagFile>$(IntermediateOutputPath)res.flag <_AndroidComponentResgenFlagFile>$(IntermediateOutputPath)Component.R.cs.flag + <_AndroidJniMarshalMethodsFlag>$(IntermediateOutputPath)jnimarshalmethods.flag <_AndroidLinkFlag>$(IntermediateOutputPath)link.flag <_AndroidApkPerAbiFlagFile>$(IntermediateOutputPath)android\bin\apk_per_abi.flag <_AndroidDebugKeyStoreFlag>$(IntermediateOutputPath)android_debug_keystore.flag @@ -2107,7 +2109,28 @@ because xbuild doesn't support framework reference assemblies. + DependsOnTargets="_ResolveAssemblies;_CreatePackageWorkspace;_GenerateJniMarshalMethods;_LinkAssembliesNoShrink;_LinkAssembliesShrink" /> + + + + <_JniFrameworkAssembly Include="Mono.Android.dll" /> + <_JniFrameworkAssembly Include="OpenTK-1.0.dll" /> + <_JniFrameworkAssembly Include="OpenTK.dll" /> + <_JniFrameworkAssembly Include="Xamarin.Android.NUnitLite.dll" /> + + + <_AssembliesToProcess Include="@(ResolvedUserAssemblies)" /> + <_AssembliesToProcess Include="@(ResolvedAssemblies)" Condition=" '%(Filename)' != '' And '@(_JniFrameworkAssembly)' != '' " /> + + + + + @@ -131,29 +132,6 @@ - - - - - - - <_DllMaps>@(_JavaInteropDllMapContent->'%(Identity)', '%0a ') - - - - diff --git a/tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj b/tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj index 8ac906b0dca..27d0431ad43 100644 --- a/tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj +++ b/tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj @@ -42,6 +42,7 @@ false armeabi-v7a;x86 r8 + True @@ -154,6 +155,7 @@ + diff --git a/tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.targets b/tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.targets new file mode 100644 index 00000000000..b8651f44a98 --- /dev/null +++ b/tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.targets @@ -0,0 +1,8 @@ + + + + + +