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