Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Several syntax errors when building binding library for Android 11. #5027

Closed
awattar opened this issue Aug 19, 2020 · 33 comments
Closed

Several syntax errors when building binding library for Android 11. #5027

awattar opened this issue Aug 19, 2020 · 33 comments
Assignees
Labels
Area: Bindings Issues in Java Library Binding projects.

Comments

@awattar
Copy link

awattar commented Aug 19, 2020

Steps to Reproduce

  1. Build binding library that worked for Android 10.
  2. Switch library target to Android 11.
  3. Build

Expected Behavior

Builds fine.

Actual Behavior

Syntax errors on lines containing generic IList with an apostrophe -

global::System.Collections.Generic.IList`1

static void n_SetNotificationUris_Landroid_content_ContentResolver_LSystem_Collections_Generic_IList_1_ (IntPtr jnienv, IntPtr native__this, IntPtr native_cr, IntPtr native_uris)
		{
			var __this = global::Java.Lang.Object.GetObject<global::Com.Good.GD.Database.Sqlite.ICrossProcessCursor> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
			var cr = global::Java.Lang.Object.GetObject<global::Android.Content.ContentResolver> (native_cr, JniHandleOwnership.DoNotTransfer);
			var uris = (global::System.Collections.Generic.IList`1)global::Java.Lang.Object.GetObject<global::System.Collections.Generic.IList`1> (native_uris, JniHandleOwnership.DoNotTransfer);
			__this.SetNotificationUris (cr, uris);
		}
#pragma warning restore 0169

		IntPtr id_setNotificationUris_Landroid_content_ContentResolver_LSystem_Collections_Generic_IList_1_;
		public unsafe void SetNotificationUris (global::Android.Content.ContentResolver cr, global::System.Collections.Generic.IList`1 uris)
		{
			if (id_setNotificationUris_Landroid_content_ContentResolver_LSystem_Collections_Generic_IList_1_ == IntPtr.Zero)
				id_setNotificationUris_Landroid_content_ContentResolver_LSystem_Collections_Generic_IList_1_ = JNIEnv.GetMethodID (class_ref, "setNotificationUris", "(Landroid/content/ContentResolver;LSystem/Collections/Generic/IList`1;)V");
			JValue* __args = stackalloc JValue [2];
			__args [0] = new JValue (cr);
			__args [1] = new JValue (uris);
			JNIEnv.CallVoidMethod (((global::Java.Lang.Object) this).Handle, id_setNotificationUris_Landroid_content_ContentResolver_LSystem_Collections_Generic_IList_1_, __args);
		}

Version Information

=== Visual Studio Enterprise 2019 for Mac ===

Version 8.7.2 (build 4)
Installation UUID: 8e69c049-a293-460a-a5b8-d3f9e691c930
GTK+ 2.24.23 (Raleigh theme)
Xamarin.Mac 6.18.0.23 (d16-6 / 088c73638)

Package version: 612000090

=== Mono Framework MDK ===

Runtime:
Mono 6.12.0.90 (2020-02/d3daacdaa80) (64-bit)
Package version: 612000090

=== Roslyn (Language Service) ===

3.7.0-6.20371.12+917b9dfae12e3b6cb266a3c062fb20a1e9d5fb06

=== NuGet ===

Version: 5.7.0.6702

=== .NET Core SDK ===

SDK: /usr/local/share/dotnet/sdk/3.1.401/Sdks
SDK Versions:
3.1.401
3.1.302
3.1.301
3.1.300
3.1.200
3.1.102
3.1.101
3.1.100
3.1.100-preview3-014645
3.0.100
MSBuild SDKs: /Library/Frameworks/Mono.framework/Versions/6.12.0/lib/mono/msbuild/Current/bin/Sdks

=== .NET Core Runtime ===

Runtime: /usr/local/share/dotnet/dotnet
Runtime Versions:
3.1.7
3.1.6
3.1.5
3.1.4
3.1.2
3.1.1
3.1.0
3.1.0-preview3.19553.2
3.0.0
2.1.21
2.1.20
2.1.19
2.1.18
2.1.16
2.1.15
2.1.14
2.1.13

=== Xamarin.Profiler ===

Version: 1.6.12.29
Location: /Applications/Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler

=== Updater ===

Version: 11

=== Xamarin.Android ===

Version: 11.0.0.3 (Visual Studio Enterprise)
Commit: xamarin-android/d16-7/aca845b
Android SDK: /Users/mwesolowski/Library/Developer/Xamarin/android-sdk-macosx
Supported Android versions:
7.0 (API level 24)
8.0 (API level 26)

SDK Tools Version: 26.1.1
SDK Platform Tools Version: 30.0.4
SDK Build Tools Version: 29.0.3

Build Information:
Mono: 83105ba
Java.Interop: xamarin/java.interop/d16-7@1f3388a
ProGuard: Guardsquare/proguard@ebe9000
SQLite: xamarin/sqlite@1a3276b
Xamarin.Android Tools: xamarin/xamarin-android-tools/d16-7@017078f

=== Microsoft OpenJDK for Mobile ===

Java SDK: /Users/mwesolowski/Library/Developer/Xamarin/jdk/microsoft_dist_openjdk_1.8.0.25
1.8.0-25
Android Designer EPL code available here:
https://github.com/xamarin/AndroidDesigner.EPL

=== Android SDK Manager ===

Version: 16.7.0.13
Hash: 8380518
Branch: remotes/origin/dev/jmt/d16-7readconfig~2
Build date: 2020-07-23 22:38:02 UTC

=== Android Device Manager ===

Version: 16.7.0.18
Hash: 4b44bc1
Branch: remotes/origin/d16-7
Build date: 2020-07-23 22:38:26 UTC

=== Apple Developer Tools ===

Xcode 11.4.1 (16137)
Build 11E503a

=== Xamarin.Mac ===

Xamarin.Mac not installed. Can't find /Library/Frameworks/Xamarin.Mac.framework/Versions/Current/Version.

=== Xamarin.iOS ===

Version: 13.20.2.2 (Visual Studio Enterprise)
Hash: 817b6f72a
Branch: d16-7
Build date: 2020-07-18 18:45:00-0400

=== Xamarin Designer ===

Version: 16.7.0.492
Hash: f5afe667d
Branch: remotes/origin/d16-7-vsmac
Build date: 2020-07-10 18:42:54 UTC

=== Build Information ===

Release ID: 807020004
Git revision: 6b86e771c92aa2615d2c2a09919bb3d4ccb69a5a
Build date: 2020-08-12 07:16:26-04
Build branch: release-8.7
Xamarin extensions: 6b86e771c92aa2615d2c2a09919bb3d4ccb69a5a

=== Operating System ===

Mac OS X 10.15.5
Darwin 19.5.0 Darwin Kernel Version 19.5.0
Tue May 26 20:41:44 PDT 2020
root:xnu-6153.121.2~2/RELEASE_X86_64 x86_64

Log File

/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(56,56): Error CS1026: ) expected (CS1026) (PROJ)
/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(56,56): Error CS1056: Unexpected character '`' (CS1056) (PROJ)
/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(57,57): Error CS1002: ; expected (CS1002) (PROJ)
/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(58,58): Error CS1002: ; expected (CS1002) (PROJ)
/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(58,58): Error CS1513: } expected (CS1513) (PROJ)
/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(134,134): Error CS1002: ; expected (CS1002) (PROJ)
/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(134,134): Error CS1056: Unexpected character '`' (CS1056) (PROJ)
/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(127,127): Error CS1001: Identifier expected (CS1001) (PROJ)
/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(127,127): Error CS1056: Unexpected character '`' (CS1056) (PROJ)
/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(130,130): Error CS1003: Syntax error, ',' expected (CS1003) (PROJ)
/Users/XXX/PROJ/obj/Release/generated/src/NAMESPACE.ICrossProcessCursor.cs(134,134): Error CS1001: Identifier expected (CS1001) (PROJ)
@awattar awattar added the Area: Bindings Issues in Java Library Binding projects. label Aug 19, 2020
@jpobst
Copy link
Contributor

jpobst commented Aug 19, 2020

I'm not sure how it could try to bind to an IList'1, as that's not a Java type. Are you changing a type to that using metadata?

Can you provide the obj/Debug/api.xml file?

@awattar
Copy link
Author

awattar commented Aug 19, 2020

Will do today or tomorrow.

@awattar
Copy link
Author

awattar commented Aug 20, 2020

Part of the api.xml with broken items

<package name="my.package.database.sqlite" jni-name="my/package/database/sqlite">
    <class abstract="true" deprecated="not deprecated" extends="java.lang.Object" extends-generic-aware="java.lang.Object" jni-extends="Ljava/lang/Object;" final="false" name="AbstractCursor" static="false" visibility="public" jni-signature="Lmy/package/database/sqlite/AbstractCursor;">
      <implements name="my.package.database.sqlite.CrossProcessCursor" name-generic-aware="my.package.database.sqlite.CrossProcessCursor" jni-type="Lmy/package/database/sqlite/CrossProcessCursor;">
      </implements>
      <constructor deprecated="not deprecated" final="false" name="AbstractCursor" jni-signature="()V" bridge="false" static="false" type="my.package.database.sqlite.AbstractCursor" synthetic="false" visibility="public">
      </constructor>
      <method abstract="false" deprecated="not deprecated" final="false" name="checkPosition" jni-signature="()V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="protected">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="close" jni-signature="()V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="copyStringToBuffer" jni-signature="(ILandroid/database/CharArrayBuffer;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
        <parameter name="p1" type="android.database.CharArrayBuffer" jni-type="Landroid/database/CharArrayBuffer;">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="deactivate" jni-signature="()V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="fillWindow" jni-signature="(ILmy/package/database/sqlite/CursorWindow;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
        <parameter name="p1" type="my.package.database.sqlite.CursorWindow" jni-type="Lmy/package/database/sqlite/CursorWindow;">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getBlob" jni-signature="(I)[B" bridge="false" native="false" return="byte[]" jni-return="[B" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getColumnCount" jni-signature="()I" bridge="false" native="false" return="int" jni-return="I" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getColumnIndex" jni-signature="(Ljava/lang/String;)I" bridge="false" native="false" return="int" jni-return="I" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="java.lang.String" jni-type="Ljava/lang/String;">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getColumnIndexOrThrow" jni-signature="(Ljava/lang/String;)I" bridge="false" native="false" return="int" jni-return="I" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="java.lang.String" jni-type="Ljava/lang/String;">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getColumnName" jni-signature="(I)Ljava/lang/String;" bridge="false" native="false" return="java.lang.String" jni-return="Ljava/lang/String;" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="true" deprecated="not deprecated" final="false" name="getColumnNames" jni-signature="()[Ljava/lang/String;" bridge="false" native="false" return="java.lang.String[]" jni-return="[Ljava/lang/String;" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="true" deprecated="not deprecated" final="false" name="getCount" jni-signature="()I" bridge="false" native="false" return="int" jni-return="I" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="true" deprecated="not deprecated" final="false" name="getDouble" jni-signature="(I)D" bridge="false" native="false" return="double" jni-return="D" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getExtras" jni-signature="()Landroid/os/Bundle;" bridge="false" native="false" return="android.os.Bundle" jni-return="Landroid/os/Bundle;" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="true" deprecated="not deprecated" final="false" name="getFloat" jni-signature="(I)F" bridge="false" native="false" return="float" jni-return="F" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="true" deprecated="not deprecated" final="false" name="getInt" jni-signature="(I)I" bridge="false" native="false" return="int" jni-return="I" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="true" deprecated="not deprecated" final="false" name="getLong" jni-signature="(I)J" bridge="false" native="false" return="long" jni-return="J" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getNotificationUri" jni-signature="()Landroid/net/Uri;" bridge="false" native="false" return="android.net.Uri" jni-return="Landroid/net/Uri;" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="getPosition" jni-signature="()I" bridge="false" native="false" return="int" jni-return="I" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="true" deprecated="not deprecated" final="false" name="getShort" jni-signature="(I)S" bridge="false" native="false" return="short" jni-return="S" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="true" deprecated="not deprecated" final="false" name="getString" jni-signature="(I)Ljava/lang/String;" bridge="false" native="false" return="java.lang.String" jni-return="Ljava/lang/String;" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getType" jni-signature="(I)I" bridge="false" native="false" return="int" jni-return="I" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getUpdatedField" jni-signature="(I)Ljava/lang/Object;" bridge="false" native="false" return="java.lang.Object" jni-return="Ljava/lang/Object;" static="false" synchronized="false" synthetic="false" visibility="protected">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getWantsAllOnMoveCalls" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getWindow" jni-signature="()Lmy/package/database/sqlite/CursorWindow;" bridge="false" native="false" return="my.package.database.sqlite.CursorWindow" jni-return="Lmy/package/database/sqlite/CursorWindow;" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="isAfterLast" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="isBeforeFirst" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="isClosed" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="isFieldUpdated" jni-signature="(I)Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="protected">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="isFirst" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="isLast" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="true" deprecated="not deprecated" final="false" name="isNull" jni-signature="(I)Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="move" jni-signature="(I)Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="moveToFirst" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="moveToLast" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="moveToNext" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="moveToPosition" jni-signature="(I)Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="true" name="moveToPrevious" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="onChange" jni-signature="(Z)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="protected">
        <parameter name="p0" type="boolean" jni-type="Z">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="onDeactivateOrClose" jni-signature="()V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="protected">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="onMove" jni-signature="(II)Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="int" jni-type="I">
        </parameter>
        <parameter name="p1" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="registerContentObserver" jni-signature="(Landroid/database/ContentObserver;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="android.database.ContentObserver" jni-type="Landroid/database/ContentObserver;">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="registerDataSetObserver" jni-signature="(Landroid/database/DataSetObserver;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="android.database.DataSetObserver" jni-type="Landroid/database/DataSetObserver;">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="requery" jni-signature="()Z" bridge="false" native="false" return="boolean" jni-return="Z" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="respond" jni-signature="(Landroid/os/Bundle;)Landroid/os/Bundle;" bridge="false" native="false" return="android.os.Bundle" jni-return="Landroid/os/Bundle;" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="android.os.Bundle" jni-type="Landroid/os/Bundle;">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="setExtras" jni-signature="(Landroid/os/Bundle;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="android.os.Bundle" jni-type="Landroid/os/Bundle;">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="setNotificationUri" jni-signature="(Landroid/content/ContentResolver;Landroid/net/Uri;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="android.content.ContentResolver" jni-type="Landroid/content/ContentResolver;">
        </parameter>
        <parameter name="p1" type="android.net.Uri" jni-type="Landroid/net/Uri;">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="unregisterContentObserver" jni-signature="(Landroid/database/ContentObserver;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="android.database.ContentObserver" jni-type="Landroid/database/ContentObserver;">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="unregisterDataSetObserver" jni-signature="(Landroid/database/DataSetObserver;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="p0" type="android.database.DataSetObserver" jni-type="Landroid/database/DataSetObserver;">
        </parameter>
      </method>
      <field deprecated="not deprecated" final="false" name="mClosed" jni-signature="Z" static="false" transient="false" type="boolean" type-generic-aware="boolean" visibility="protected" volatile="false">
      </field>
      <field deprecated="not deprecated" final="false" name="mContentResolver" jni-signature="Landroid/content/ContentResolver;" static="false" transient="false" type="android.content.ContentResolver" type-generic-aware="android.content.ContentResolver" visibility="protected" volatile="false">
      </field>
      <field deprecated="not deprecated" final="false" name="mCurrentRowID" jni-signature="Ljava/lang/Long;" static="false" transient="false" type="java.lang.Long" type-generic-aware="java.lang.Long" visibility="protected" volatile="false">
      </field>
      <field deprecated="not deprecated" final="false" name="mPos" jni-signature="I" static="false" transient="false" type="int" type-generic-aware="int" visibility="protected" volatile="false">
      </field>
      <field deprecated="not deprecated" final="false" name="mRowIdColumnIndex" jni-signature="I" static="false" transient="false" type="int" type-generic-aware="int" visibility="protected" volatile="false">
      </field>
      <field deprecated="not deprecated" final="false" name="mUpdatedRows" jni-signature="Ljava/util/HashMap;" static="false" transient="false" type="java.util.HashMap" type-generic-aware="java.util.HashMap&lt;java.lang.Long, java.util.Map&lt;java.lang.String, java.lang.Object&gt;&gt;" visibility="protected" volatile="false">
      </field>
    </class>
    <class abstract="false" deprecated="not deprecated" extends="android.database.ContentObserver" extends-generic-aware="android.database.ContentObserver" jni-extends="Landroid/database/ContentObserver;" final="false" name="AbstractCursor.SelfContentObserver" static="true" visibility="protected" jni-signature="Lmy/package/database/sqlite/AbstractCursor$SelfContentObserver;">
      <constructor deprecated="not deprecated" final="false" name="AbstractCursor.SelfContentObserver" jni-signature="(Lmy/package/database/sqlite/AbstractCursor;)V" bridge="false" static="false" type="my.package.database.sqlite.AbstractCursor.SelfContentObserver" synthetic="false" visibility="public">
        <parameter name="p0" type="my.package.database.sqlite.AbstractCursor" jni-type="Lmy/package/database/sqlite/AbstractCursor;">
        </parameter>
      </constructor>
    </class>

@brendanzagaeski brendanzagaeski added this to the Under Consideration milestone Aug 20, 2020
@awattar
Copy link
Author

awattar commented Aug 20, 2020

For some reason in Android 11 it seems to generate SetNotificationUris with IList`1 of uris instead of SetNotificationUri with one uri.

@jpobst
Copy link
Contributor

jpobst commented Aug 20, 2020

I don't see any issues with the api.xml. Are you able to provide a project that reproduces the issue or the .jar that you are trying to bind? If you don't want it to be public, you can email it to the @microsoft.com email in my profile.

@awattar
Copy link
Author

awattar commented Aug 20, 2020

OK. I could try but it is rather big and won't fit standard email size.

Could you look at my last comment - it seems that the binding generator is trying to create list so there is plural ”s” at the generated method name and the parameter uris is also prualar but it should be singular.

@jpobst
Copy link
Contributor

jpobst commented Aug 20, 2020

The reason is that in API 29+ CursorWrapper there is now a SetNotificationUris method that takes a List<Uri>: https://developer.android.com/reference/android/database/CursorWrapper#setNotificationUris(android.content.ContentResolver,%20java.util.List%3Candroid.net.Uri%3E)

Maybe the .jar you are trying to bind overrides both methods, but when you target 28 or below it can't find the base method (since it doesn't exist) and therefore doesn't try to generate SetNotificationUris.

But when you change to API 29+ the base method can be found and it tries to generate the method.

I suspect in API 29+ it is generating both methods, not just the plural version. So the issue probably isn't anything "weird", it's just a problem understanding generics which is a common issue.

@awattar
Copy link
Author

awattar commented Aug 20, 2020

I'll check the jar later. Does 29+ means 29 and above? It was working for Android 10 - 29 but it doesn't work for Android 11 - 30.

Could you elaborate ”it's just a problem understanding generics which is a common issue”? Can I do anything about it?

@awattar
Copy link
Author

awattar commented Aug 20, 2020

Isn't it reintroduced

dotnet/java-interop#543

by this change

dotnet/java-interop#450

?

@jpobst
Copy link
Contributor

jpobst commented Aug 20, 2020

It's possible, but I'm not sure how. That code still exists and hasn't been touched in this release to my knowledge.

I am hoping once I have the .jar file I can step through the debugger and find why this is happening.

@awattar
Copy link
Author

awattar commented Aug 25, 2020

@jpobst I've sent you an email with jar file. Please let me know if it will help you investigate the issue.

@jpobst
Copy link
Contributor

jpobst commented Aug 25, 2020

Simplified test case, running against API-30 fails, while API-29 succeeds:

package com.blah;

import android.database.Cursor;

public interface MyCursor extends Cursor { }

@awattar
Copy link
Author

awattar commented Aug 25, 2020

Does it mean that the issue is in the generator?

I was also trying to remove the error causing method by the transform but without luck it must be on the other phase of the generation process.

@jpobst
Copy link
Contributor

jpobst commented Aug 25, 2020

Yeah, the issue is in generator. It's not enough to just strip the arity, as was done in dotnet/java-interop#450.

Given this:

var uris = (global::System.Collections.Generic.IList`1)global::Java.Lang.Object.GetObject<global::System.Collections.Generic.IList`1> (native_uris, JniHandleOwnership.DoNotTransfer);

Changing it to this doesn't work:

(global::System.Collections.Generic.IList)

It won't be a syntax error anymore, but it doesn't match the required type, so it still errors.

CS0266 Cannot implicitly convert type 'System.Collections.IList' to 'System.Collections.Generic.IList<Android.Net.Uri>'. An explicit conversion exists (are you missing a cast?)

It has to be changed to:

(global::System.Collections.Generic.IList<Android.Net.Uri>)

Unfortunately this isn't something that can be worked around with metadata, as it is implementing an interface invoker for the android.database.Cursor type from android.jar.

The only workarounds I am currently aware of are:

  • Do not set Android 11 as the target framework.
  • Do not attempt to implement or extend the android.database.Cursor interface.

@awattar
Copy link
Author

awattar commented Aug 25, 2020

OK. We can wait with changing the target framework for some time. I'm hoping it can be fixed internally in the generator soon. Any ETA?

@jpobst
Copy link
Contributor

jpobst commented Aug 26, 2020

I filed a cleaned up version of this issue in Java.Interop for generator: dotnet/java-interop#699.

The deadline for 16.8/8.8 is pretty much passed, so likely 16.9/8.9 is the earliest.

@jpobst jpobst closed this as completed Aug 26, 2020
@awattar
Copy link
Author

awattar commented Aug 26, 2020

Thanks.

jonpryor pushed a commit that referenced this issue Sep 17, 2020
Fixes: #5027
Context: dotnet/java-interop#699

The [`Cursor.setnotificationUris(ContentResolver, List<Uri>)`][0]
interface default method was added in API-29.

This introduces an issue when implementing `Android.Database.ICursor`
in API-30+: when binding a Java class that implements `Cursor`:

	// Java
	public class MyCursor implements android.database.Cursor {
	    // …
	}

In the binding `generator` emits for `MyCursor`, the Java-to-managed
marshal method to support `Cursor.setNotificationUris()` does not
compile, as it tries to use a generic type -- `IList<T>` -- without
providing any generic type parameters:

	// C# binding
	public partial class MyCursor : Java.Lang.Object, ICursor {
	    static void n_SetNotificationUris_1 (IntPtr jnienv, IntPtr native__this, IntPtr native_cr, IntPtr native_uris)
	    {
	        var __this  = Java.Lang.Object.GetObject<MyCursor> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
	        var cr      = Java.Lang.Object.GetObject<ContentResolver> (native_cr, JniHandleOwnership.DoNotTransfer);
	        var uris    = (System.Collections.Generic.IList`1) Java.Lang.Object.GetObject<System.Collections.Generic.IList`1> (native_uris, JniHandleOwnership.DoNotTransfer);
	        __this.SetNotificationUris (cr, uris);
	    }
	}

We had thought that dotnet/java-interop@262743b47 addressed this
issue, but we were mistaken.

The `generator` fix for this scenario seems tricky, so as a workaround
for now we can simply remove the `Cursor.setNotificationUris()` default
method so users can implement the interface.

(Although the method was added in API-29, we don't support
Default Interface Members in API-29, so it was ignored.  Thus, this
problem doesn't show up until API-30+ is used.)

[0]: https://developer.android.com/reference/android/database/Cursor#setNotificationUris(android.content.ContentResolver,%20java.util.List%3Candroid.net.Uri%3E)
jonpryor pushed a commit that referenced this issue Sep 17, 2020
Fixes: #5027
Context: dotnet/java-interop#699

The [`Cursor.setnotificationUris(ContentResolver, List<Uri>)`][0]
interface default method was added in API-29.

This introduces an issue when implementing `Android.Database.ICursor`
in API-30+: when binding a Java class that implements `Cursor`:

	// Java
	public class MyCursor implements android.database.Cursor {
	    // …
	}

In the binding `generator` emits for `MyCursor`, the Java-to-managed
marshal method to support `Cursor.setNotificationUris()` does not
compile, as it tries to use a generic type -- `IList<T>` -- without
providing any generic type parameters:

	// C# binding
	public partial class MyCursor : Java.Lang.Object, ICursor {
	    static void n_SetNotificationUris_1 (IntPtr jnienv, IntPtr native__this, IntPtr native_cr, IntPtr native_uris)
	    {
	        var __this  = Java.Lang.Object.GetObject<MyCursor> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
	        var cr      = Java.Lang.Object.GetObject<ContentResolver> (native_cr, JniHandleOwnership.DoNotTransfer);
	        var uris    = (System.Collections.Generic.IList`1) Java.Lang.Object.GetObject<System.Collections.Generic.IList`1> (native_uris, JniHandleOwnership.DoNotTransfer);
	        __this.SetNotificationUris (cr, uris);
	    }
	}

We had thought that dotnet/java-interop@262743b47 addressed this
issue, but we were mistaken.

The `generator` fix for this scenario seems tricky, so as a workaround
for now we can simply remove the `Cursor.setNotificationUris()` default
method so users can implement the interface.

(Although the method was added in API-29, we don't support
Default Interface Members in API-29, so it was ignored.  Thus, this
problem doesn't show up until API-30+ is used.)

[0]: https://developer.android.com/reference/android/database/Cursor#setNotificationUris(android.content.ContentResolver,%20java.util.List%3Candroid.net.Uri%3E)
@jpobst
Copy link
Contributor

jpobst commented Sep 17, 2020

While we can't get the real fix into 16.8, I did manage to simply remove the offending method for 16.8 Preview 4, which should allow implementing this interface: #5124.

@awattar
Copy link
Author

awattar commented Sep 17, 2020

Thanks! I’ll check that once 16.8 Preview 4 will land in the preview channel.

jonpryor pushed a commit that referenced this issue Sep 28, 2020
Fixes: #5027
Context: dotnet/java-interop#699
Context: dotnet/java-interop#699 (comment)
Context: eadd3bd

The [`Cursor.getNotificationUris()`][0] interface default method was
added in API-29.

Much as with `Cursor.setNotificationUris()` and commit eadd3bd, this
introduces an issue when implementing `Android.Database.ICursor`
in API-30+: when binding a Java class that implements `Cursor`:

	// Java
	public class MyCursor implements android.database.Cursor {
	    // …
	}

In the binding `generator` emits for `MyCursor`, the Java-to-managed
marshal method to support `Cursor.getNotificationUris()` does not
compile, as it tries to use a generic type -- `IList<T>` -- without
providing any generic type parameters:

	// C# binding
	public partial class MyCursor : Java.Lang.Object, ICursor {
	    static IntPtr n_GetNotificationUris (IntPtr jnienv, IntPtr native__this)
	    {
	        var __this  = Java.Lang.Object.GetObject<MyCursor> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
	        return global::Android.Runtime.JavaList.ToLocalJniHandle (__this.NotificationUris);;
	        // ^^ error CS1503: Argument 1: cannot convert from 'System.Collections.Generic.IList<Android.Net.Uri>' to 'System.Collections.IList?'
	    }
	}

We had thought that dotnet/java-interop@262743b47 addressed this
issue, but we were mistaken.

The `generator` fix for this scenario seems tricky, so as a workaround
for now we can simply remove the `Cursor.getNotificationUris()` default
method so users can implement the interface.

(Although the method was added in API-29, we don't support
Default Interface Members in API-29, so it was ignored.  Thus, this
problem doesn't show up until API-30+ is used.)

[0]: https://developer.android.com/reference/android/database/Cursor#getNotificationUris()
jonpryor pushed a commit that referenced this issue Oct 12, 2020
Fixes: #5027
Context: dotnet/java-interop#699
Context: dotnet/java-interop#699 (comment)
Context: eadd3bd

The [`Cursor.getNotificationUris()`][0] interface default method was
added in API-29.

Much as with `Cursor.setNotificationUris()` and commit eadd3bd, this
introduces an issue when implementing `Android.Database.ICursor`
in API-30+: when binding a Java class that implements `Cursor`:

	// Java
	public class MyCursor implements android.database.Cursor {
	    // …
	}

In the binding `generator` emits for `MyCursor`, the Java-to-managed
marshal method to support `Cursor.getNotificationUris()` does not
compile, as it tries to use a generic type -- `IList<T>` -- without
providing any generic type parameters:

	// C# binding
	public partial class MyCursor : Java.Lang.Object, ICursor {
	    static IntPtr n_GetNotificationUris (IntPtr jnienv, IntPtr native__this)
	    {
	        var __this  = Java.Lang.Object.GetObject<MyCursor> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
	        return global::Android.Runtime.JavaList.ToLocalJniHandle (__this.NotificationUris);;
	        // ^^ error CS1503: Argument 1: cannot convert from 'System.Collections.Generic.IList<Android.Net.Uri>' to 'System.Collections.IList?'
	    }
	}

We had thought that dotnet/java-interop@262743b47 addressed this
issue, but we were mistaken.

The `generator` fix for this scenario seems tricky, so as a workaround
for now we can simply remove the `Cursor.getNotificationUris()` default
method so users can implement the interface.

(Although the method was added in API-29, we don't support
Default Interface Members in API-29, so it was ignored.  Thus, this
problem doesn't show up until API-30+ is used.)

[0]: https://developer.android.com/reference/android/database/Cursor#getNotificationUris()
@brendanzagaeski

This comment has been minimized.

@awattar
Copy link
Author

awattar commented Oct 14, 2020

Thanks @brendanzagaeski for the update but the fix doesn't work as there was another update for this fix.

Currently, it removes set methods https://github.com/xamarin/xamarin-android/pull/5124/commits but does not fix the issue as there was a second part with removed get methods https://github.com/xamarin/xamarin-android/pull/5161/commits that was not merged yet.

Any chances for the update anytime soon?

@brendanzagaeski
Copy link
Contributor

Thanks for the heads-up and the question! It looks like that second part of the fix is under consideration for inclusion in a future Visual Studio 2019 version 16.8 Preview (and Visual Studio 2019 for Mac version 8.8 Preview). I'll plan to update this issue again when a Preview version containing that second part of the fix is available.

@awattar
Copy link
Author

awattar commented Oct 14, 2020

Thanks @brendanzagaeski. Please note that the one fix does not work without the other.

@brendanzagaeski
Copy link
Contributor

Release status update

A new Preview version of Xamarin.Android has now been published that includes both the first part of the fix from #5124 and the second part of the fix from #5161. The fix is not yet included in a Release version. I will update this item again when a Release version is available that includes the fix.

Fix included in Xamarin.Android SDK version 11.1.0.17.

Fix included on Windows in Visual Studio 2019 version 16.8 Preview 5. To try the Preview version that includes the fix, check for the latest updates in Visual Studio Preview.

Fix included on macOS in Visual Studio 2019 for Mac version 8.8 Preview 5. To try the Preview version that includes the fix, check for the latest updates on the Preview updater channel.

@awattar
Copy link
Author

awattar commented Oct 20, 2020

@brendanzagaeski Thanks, will be testing now.

@awattar
Copy link
Author

awattar commented Oct 22, 2020

@brendanzagaeski @jpobst @jonathanpeppers Unfortunately during tests we are getting "random" errors - random because it occurs on 2 from 5 test machines with identical software configuration.

Using "GenerateLibraryResources" task from assembly "/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Build.Tasks.dll".
  Task "GenerateLibraryResources"
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error : Unexpected end of file while parsing Name has occurred. Line 25, position 3.
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.XmlTextReaderImpl.Throw (System.Exception e) [0x00027] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/mcs/class/referencesource/System.Xml/System/Xml/Core/XmlTextReaderImpl.cs:2503 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.XmlTextReaderImpl.Throw (System.String res, System.String arg) [0x00000] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/mcs/class/referencesource/System.Xml/System/Xml/Core/XmlTextReaderImpl.cs:2478 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.XmlTextReaderImpl.Throw (System.Int32 pos, System.String res, System.String arg) [0x0000c] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/mcs/class/referencesource/System.Xml/System/Xml/Core/XmlTextReaderImpl.cs:2456 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.XmlTextReaderImpl.ParseQName (System.Boolean isQName, System.Int32 startOffset, System.Int32& colonPos) [0x0004f] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/mcs/class/referencesource/System.Xml/System/Xml/Core/XmlTextReaderImpl.cs:6794 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.XmlTextReaderImpl.ParseQName (System.Int32& colonPos) [0x00000] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/mcs/class/referencesource/System.Xml/System/Xml/Core/XmlTextReaderImpl.cs:6765 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.XmlTextReaderImpl.ThrowTagMismatch (System.Xml.XmlTextReaderImpl+NodeData startTag) [0x0000c] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/mcs/class/referencesource/System.Xml/System/Xml/Core/XmlTextReaderImpl.cs:4248 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.XmlTextReaderImpl.ParseEndElement () [0x00085] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/mcs/class/referencesource/System.Xml/System/Xml/Core/XmlTextReaderImpl.cs:4149 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.XmlTextReaderImpl.ParseElementContent () [0x00149] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/mcs/class/referencesource/System.Xml/System/Xml/Core/XmlTextReaderImpl.cs:3820 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.XmlTextReaderImpl.Read () [0x00085] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/mcs/class/referencesource/System.Xml/System/Xml/Core/XmlTextReaderImpl.cs:1166 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.Linq.XContainer.ReadContentFrom (System.Xml.XmlReader r) [0x0001b] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/external/corefx/src/System.Private.Xml.Linq/src/System/Xml/Linq/XContainer.cs:860 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.Linq.XContainer.ReadContentFrom (System.Xml.XmlReader r, System.Xml.Linq.LoadOptions o) [0x00005] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/external/corefx/src/System.Private.Xml.Linq/src/System/Xml/Linq/XContainer.cs:867 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.Linq.XDocument.Load (System.Xml.XmlReader reader, System.Xml.Linq.LoadOptions options) [0x00024] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/external/corefx/src/System.Private.Xml.Linq/src/System/Xml/Linq/XDocument.cs:430 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.Linq.XDocument.Load (System.String uri, System.Xml.Linq.LoadOptions options) [0x0000f] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/external/corefx/src/System.Private.Xml.Linq/src/System/Xml/Linq/XDocument.cs:222 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at System.Xml.Linq.XDocument.Load (System.String uri) [0x00000] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/external/corefx/src/System.Private.Xml.Linq/src/System/Xml/Linq/XDocument.cs:190 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at Xamarin.Android.Tools.AndroidAppManifest.Load (System.String filename, Xamarin.Android.Tools.AndroidVersions versions) [0x0001c] in /Users/builder/azdo/_work/287/s/xamarin-android/external/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs:86 
    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1325,2): error :   at Xamarin.Android.Tasks.GenerateLibraryResources.RunTaskAsync () [0x00120] in <0d3a2268388448fdb90b4a54c411a87d>:0 
  Done executing task "GenerateLibraryResources" -- FAILED.

or

image

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1813,3): error AMM0000: Error: Exception while merging manifests
MANIFESTMERGER : error : Exception while merging manifests
/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1813,3): error AMM0000: Error: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.
MANIFESTMERGER : error : org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.

Are you aware of anything changed lately in the preview release that could induce this issue?

@awattar
Copy link
Author

awattar commented Oct 23, 2020

It seems to be related to the latest stable packages for GooglePlayServices when combined with bindings library build with P5 VS:

  <package id="Xamarin.GooglePlayServices.Base" version="117.1.0" targetFramework="monoandroid11.0" />
  <package id="Xamarin.GooglePlayServices.Basement" version="117.1.1" targetFramework="monoandroid11.0" />
  <package id="Xamarin.GooglePlayServices.Location" version="117.0.0" targetFramework="monoandroid11.0" />
  <package id="Xamarin.GooglePlayServices.Places.PlaceReport" version="117.0.0" targetFramework="monoandroid11.0" />
  <package id="Xamarin.GooglePlayServices.Tasks" version="117.0.0" targetFramework="monoandroid11.0" />

When downgrading those packages to the previous stable it works fine:

  <package id="Xamarin.GooglePlayServices.Base" version="71.1610.4" targetFramework="monoandroid11.0" />
  <package id="Xamarin.GooglePlayServices.Basement" version="71.1620.4" targetFramework="monoandroid11.0" />
  <package id="Xamarin.GooglePlayServices.Location" version="71.1600.4" targetFramework="monoandroid11.0" />
  <package id="Xamarin.GooglePlayServices.Places.PlaceReport" version="71.1600.4" targetFramework="monoandroid11.0" />
  <package id="Xamarin.GooglePlayServices.Tasks" version="71.1601.4" targetFramework="monoandroid11.0" />

So there is obviously something with manifest merger shipped with Xamarin or other intermediate XML manifests/resource reader.

@jonathanpeppers
Copy link
Member

@awattar I think there was a particular version of Xamarin.Build.Download that caused GenerateLibraryResources to fail.

Can you use the latest Xamarin.Build.Download?

@awattar
Copy link
Author

awattar commented Oct 23, 2020

@jonathanpeppers we were facing "error XA0000: Unhandled exception: System.IO.IOException: Sharing violation on path" - https://stackoverflow.com/questions/60184516/how-to-avoid-exception-sharing-violation-on-path-android-gms-r-java-and-andro - when using 0.7.0 some time ago and after switching to 0.8.0 it was gone. Now 0.10.0 is required by some of the recent other NuGets including GooglePlayServices so there is no way to use something different.

The issue happens only on some machines and only when new binding build with fixed preview is combined with the 117 (stable) GooglePlayServices. It doesn't occur with downgraded GooglePlayServices or when binding library is not built with the latest preview.

Perhaps more log should be added around

/Users/USER/Library/Developer/Xamarin/jdk/microsoft_dist_openjdk_1.8.0.25/bin/java -cp /Library/Frameworks/Xamarin.Android.framework/Libraries/xbuild/Xamarin/Android/manifestmerger.jar com.xamarin.manifestmerger.Main obj/Debug/android/manifestmerger.rsp

execution that could print manifestmerger.rsp content.

@awattar
Copy link
Author

awattar commented Oct 26, 2020

@jonathanpeppers we were able to solve it - it was not strictly related to the Xamarin.Build.Download but rather its cache /Users/USER/Library/Caches/XamarinBuildDownload. After clearing the cache everything went smooth. So thanks for pointing this out.

@brendanzagaeski
Copy link
Contributor

Release status update

A new Release version of Xamarin.Android has now been published that includes both the first part of the fix from #5124 and the second part of the fix from #5161, as previously published in the Preview versions.

Fix included in Xamarin.Android SDK version 11.1.0.17.

Fix included on Windows in Visual Studio 2019 version 16.8. To get the new version that includes the fix, check for the latest updates or install the most recent release from https://visualstudio.microsoft.com/downloads/.

Fix included on macOS in Visual Studio 2019 for Mac version 8.8. To get the new version that includes the fix, check for the latest updates on the Stable updater channel.

@awattar
Copy link
Author

awattar commented Nov 10, 2020

Thank you all for the fix. @brendanzagaeski thanks for the info.

@AlejandroRuiz
Copy link

I was having a similar issue, after a month without using my Mac I upgraded to latest stable Xamarin tooling(Xamarin.Android Version: 11.1.0.26) but I was still having the issue and I solved by removing the cache folder as @awattar indicates in a previous comment

@jonathanpeppers we were able to solve it - it was not strictly related to the Xamarin.Build.Download but rather its cache /Users/USER/Library/Caches/XamarinBuildDownload. After clearing the cache everything went smooth. So thanks for pointing this out.

@ghost ghost locked as resolved and limited conversation to collaborators Jun 4, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Area: Bindings Issues in Java Library Binding projects.
Projects
None yet
Development

No branches or pull requests

5 participants