diff --git a/build-tools/installers/create-installers.targets b/build-tools/installers/create-installers.targets index 4d067a50807..47c113a28fa 100644 --- a/build-tools/installers/create-installers.targets +++ b/build-tools/installers/create-installers.targets @@ -188,6 +188,7 @@ <_MSBuildFiles Include="$(MSBuildSrcDir)\java_runtime.dex" /> <_MSBuildFiles Include="$(MSBuildSrcDir)\java_runtime_fastdev.dex" /> <_MSBuildFiles Include="$(MSBuildSrcDir)\manifestmerger.jar" /> + <_MSBuildFiles Include="$(MSBuildSrcDir)\protobuf-net.dll" /> <_MSBuildFiles Include="$(MSBuildSrcDir)\SgmlReaderDll.dll" /> <_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Aapt.targets" /> <_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Aapt2.targets" /> diff --git a/external/Java.Interop b/external/Java.Interop index 476597b63f0..4565369743a 160000 --- a/external/Java.Interop +++ b/external/Java.Interop @@ -1 +1 @@ -Subproject commit 476597b63f049b12615a810f2027df6dd68b7ffe +Subproject commit 4565369743a58a1d43e5a79c406c27d46b81bb08 diff --git a/src/Mono.Android/Android.Runtime/JNIEnv.cs b/src/Mono.Android/Android.Runtime/JNIEnv.cs index fe7a10aae70..69cbc533d32 100644 --- a/src/Mono.Android/Android.Runtime/JNIEnv.cs +++ b/src/Mono.Android/Android.Runtime/JNIEnv.cs @@ -1123,16 +1123,31 @@ static Dictionary> CreateNativeArrayToManag CopyArray (source, r); return r; } }, + { typeof (ushort), (type, source, len) => { + var r = new ushort [len]; + CopyArray (source, r); + return r; + } }, { typeof (int), (type, source, len) => { var r = new int[len]; CopyArray (source, r); return r; } }, + { typeof (uint), (type, source, len) => { + var r = new uint[len]; + CopyArray (source, r); + return r; + } }, { typeof (long), (type, source, len) => { var r = new long[len]; CopyArray (source, r); return r; } }, + { typeof (ulong), (type, source, len) => { + var r = new ulong[len]; + CopyArray (source, r); + return r; + } }, { typeof (float), (type, source, len) => { var r = new float[len]; CopyArray (source, r); @@ -1592,6 +1607,29 @@ public static Java.Lang.Object[] ToObjectArray (T[] array) return ret; } + public static unsafe void CopyArray (IntPtr src, uint[] dest) + { + if (src == IntPtr.Zero) + return; + fixed (uint* __p = dest) + JniEnvironment.Arrays.GetIntArrayRegion (new JniObjectReference (src), 0, dest.Length, (int*) __p); + } + + public static unsafe void CopyArray (IntPtr src, ushort[] dest) + { + if (src == IntPtr.Zero) + return; + fixed (ushort* __p = dest) + JniEnvironment.Arrays.GetShortArrayRegion (new JniObjectReference (src), 0, dest.Length, (short*) __p); + } + + public static unsafe void CopyArray (IntPtr src, ulong[] dest) + { + if (src == IntPtr.Zero) + return; + fixed (ulong* __p = dest) + JniEnvironment.Arrays.GetLongArrayRegion (new JniObjectReference (src), 0, dest.Length, (long*) __p); + } #if ANDROID_8 [DllImport ("libjnigraphics.so")] static extern int AndroidBitmap_getInfo (IntPtr env, IntPtr jbitmap, out Android.Graphics.AndroidBitmapInfo info); diff --git a/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/KotlinUnsignedTypesTests.cs b/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/KotlinUnsignedTypesTests.cs new file mode 100644 index 00000000000..0550aa3e067 --- /dev/null +++ b/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/KotlinUnsignedTypesTests.cs @@ -0,0 +1,92 @@ +using System; +using Com.Xamarin.Android; +using Foo; +using Java.Lang; +using NUnit.Framework; + +namespace Xamarin.Android.JcwGenTests +{ + [TestFixture] + public class KotlinUnsignedTypesTests + { + [Test] + public void TestUnsignedTypeMembers () + { + var foo = new Foo.UnsignedInstanceMethods (); + + Assert.AreEqual (uint.MaxValue, foo.UnsignedInstanceMethod (uint.MaxValue)); + + Assert.AreEqual (3u, foo.UnsignedInstanceProperty); + foo.UnsignedInstanceProperty = uint.MaxValue; + Assert.AreEqual (uint.MaxValue, foo.UnsignedInstanceProperty); + + Assert.AreEqual (ushort.MaxValue, foo.UshortInstanceMethod (ushort.MaxValue)); + + Assert.AreEqual (3u, foo.UshortInstanceProperty); + foo.UshortInstanceProperty = ushort.MaxValue; + Assert.AreEqual (ushort.MaxValue, foo.UshortInstanceProperty); + + Assert.AreEqual (ulong.MaxValue, foo.UlongInstanceMethod (ulong.MaxValue)); + + Assert.AreEqual (3u, foo.UlongInstanceProperty); + foo.UlongInstanceProperty = ulong.MaxValue; + Assert.AreEqual (ulong.MaxValue, foo.UlongInstanceProperty); + + Assert.AreEqual (byte.MaxValue, foo.UbyteInstanceMethod (byte.MaxValue)); + + Assert.AreEqual (3u, foo.UbyteInstanceProperty); + foo.UbyteInstanceProperty = byte.MaxValue; + Assert.AreEqual (byte.MaxValue, foo.UbyteInstanceProperty); + } + + [Test] + public void TestUnsignedArrayTypeMembers () + { + var foo = new Foo.UnsignedInstanceMethods (); + + var uint_array = new uint [] { 1u, 2u, uint.MaxValue }; + var ushort_array = new ushort [] { 1, 2, ushort.MaxValue }; + var ulong_array = new ulong [] { 1u, 2u, ulong.MaxValue }; + var ubyte_array = new byte [] { 1, 2, byte.MaxValue }; + + Assert.AreEqual (uint_array, foo.UintArrayInstanceMethod (uint_array)); + Assert.AreEqual (ushort_array, foo.UshortArrayInstanceMethod (ushort_array)); + Assert.AreEqual (ulong_array, foo.UlongArrayInstanceMethod (ulong_array)); + Assert.AreEqual (ubyte_array, foo.UbyteArrayInstanceMethod (ubyte_array)); + } + + [Test] + public void TestUnsignedTypeInterfaceImplementedMembers () + { + var foo = new Foo.UnsignedInterfaceImplementedMethods (); + + var uint_array = new uint [] { 1u, 2u, uint.MaxValue }; + + Assert.AreEqual (uint.MaxValue, foo.UnsignedInterfaceMethod (uint.MaxValue)); + + Assert.AreEqual (3u, foo.UnsignedInterfaceProperty); + foo.UnsignedInterfaceProperty = uint.MaxValue; + Assert.AreEqual (uint.MaxValue, foo.UnsignedInterfaceProperty); + + Assert.AreEqual (uint_array, foo.UnsignedArrayInterfaceMethod (uint_array)); + } + + [Test] + public void TestUnsignedTypeAbstractImplementedMembers () + { + var foo = new Foo.UnsignedAbstractImplementedMethods (); + + Assert.AreEqual (uint.MaxValue, foo.UnsignedAbstractMethod (uint.MaxValue)); + + Assert.AreEqual (3u, foo.UnsignedAbstractClassProperty); + foo.UnsignedAbstractClassProperty = uint.MaxValue; + Assert.AreEqual (uint.MaxValue, foo.UnsignedAbstractClassProperty); + } + + [Test] + public void TestUnsignedConstant () + { + Assert.AreEqual (3u, Foo.UnsignedMethodsKt.SubsystemDeprecated); + } + } +} diff --git a/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj b/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj index 634a17f7402..a253079d8ab 100644 --- a/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj +++ b/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj @@ -52,6 +52,7 @@ + diff --git a/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Jars/KotlinUnsignedTypes.jar b/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Jars/KotlinUnsignedTypes.jar new file mode 100644 index 00000000000..a2aa6ef44ca Binary files /dev/null and b/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Jars/KotlinUnsignedTypes.jar differ diff --git a/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Jars/UnsignedMethods.kt b/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Jars/UnsignedMethods.kt new file mode 100644 index 00000000000..bef735db303 --- /dev/null +++ b/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Jars/UnsignedMethods.kt @@ -0,0 +1,74 @@ +// Compile with: +// kotlinc UnsignedMethods.kt -d KotlinUnsignedTypes.jar + +package foo; + +@kotlin.ExperimentalUnsignedTypes +const val SUBSYSTEM_DEPRECATED: UInt = 3u + +@kotlin.ExperimentalUnsignedTypes +open class UnsignedInstanceMethods { + public open fun unsignedInstanceMethod (value: UInt) : UInt { return value; } + + public open fun ushortInstanceMethod (value: UShort) : UShort { return value; } + + public open fun ulongInstanceMethod (value: ULong) : ULong { println ("kotlin: " + value); return value; } + + public open fun ubyteInstanceMethod (value: UByte) : UByte { return value; } + + var signedInstanceProperty: Int = 3 + + var unsignedInstanceProperty: UInt = 3u + + var ushortInstanceProperty: UShort = 3u + + var ulongInstanceProperty: ULong = 3u + + var ubyteInstanceProperty: UByte = 3u + + public open fun uintArrayInstanceMethod (value: UIntArray) : UIntArray { return value; } + + public open fun ushortArrayInstanceMethod (value: UShortArray) : UShortArray { return value; } + + public open fun ulongArrayInstanceMethod (value: ULongArray) : ULongArray { return value; } + + public open fun ubyteArrayInstanceMethod (value: UByteArray) : UByteArray { return value; } + + public open fun intArrayInstanceMethod (value: IntArray) : IntArray { return value; } +} + +@kotlin.ExperimentalUnsignedTypes +open class UnsignedInterfaceImplementedMethods : UnsignedInterface { + public override open fun unsignedInterfaceMethod (value: UInt) : UInt { return value; } + + public override open fun unsignedArrayInterfaceMethod (value: UIntArray) : UIntArray { return value; } + + override var unsignedInterfaceProperty: UInt = 3u + + override var signedInterfaceProperty: Int = 3 +} + +@kotlin.ExperimentalUnsignedTypes +open class UnsignedAbstractImplementedMethods : UnsignedAbstractClass () { + public override open fun unsignedAbstractMethod (value: UInt) : UInt { return value; } + + override var unsignedAbstractClassProperty: UInt = 3u +} + +@kotlin.ExperimentalUnsignedTypes +abstract class UnsignedAbstractClass { + abstract fun unsignedAbstractMethod (value: UInt) : UInt + + abstract var unsignedAbstractClassProperty: UInt +} + +@kotlin.ExperimentalUnsignedTypes +interface UnsignedInterface { + fun unsignedInterfaceMethod (value: UInt) : UInt + + fun unsignedArrayInterfaceMethod (value: UIntArray) : UIntArray + + var unsignedInterfaceProperty: UInt + + var signedInterfaceProperty: Int +} \ No newline at end of file diff --git a/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Jars/org.jetbrains.kotlin.kotlin-stdlib.jar b/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Jars/org.jetbrains.kotlin.kotlin-stdlib.jar new file mode 100644 index 00000000000..445c6550225 Binary files /dev/null and b/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Jars/org.jetbrains.kotlin.kotlin-stdlib.jar differ diff --git a/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Xamarin.Android.McwGen-Tests.csproj b/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Xamarin.Android.McwGen-Tests.csproj index cbcae2e0410..044fe4bdcc6 100644 --- a/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Xamarin.Android.McwGen-Tests.csproj +++ b/tests/CodeGen-Binding/Xamarin.Android.McwGen-Tests/Xamarin.Android.McwGen-Tests.csproj @@ -134,6 +134,12 @@ Jars/xamarin-test.jar + + + + + +