1

我正在尝试绑定 mapsforge JAR。在这个库的 Overlay 类中有许多通用集合。Overlay 类实现 Java.Util.IList 和接口 Java.Util.IList 想要这样实现

"Mapsforge.Android.Maps.OverlayNs.OverlayList" does not implement "Java.Util.IList.AddAll(int, System.Collections.ICollection)" 8 23 MapForgeDroid

所以,我创建了 Metadata.xml Mapsforge.Android Mapsforge.Android.Maps.OverlayNs

  <!-- Return Java.Lang.Object in OverlayManager so that we match interface. -->
    <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayCircleOverlay']/method[@name='createCircle']" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayItemizedOverlay']/method[@name='createItem']" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayWayOverlay']/method[@name='createWay']" name="managedReturn">Java.Lang.Object</attr>   

    <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayItemizedOverlay']/method[@name='getThreadName']" name="visibility">protected</attr>
    <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayCircleOverlay']/method[@name='getThreadName']" name="visibility">protected</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayWayOverlay']/method[@name='getThreadName']" name="visibility">protected</attr>

  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='add' and count(parameter)=1]/parameter[@name='p0']" name="managedType">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='add' and count(parameter)=2]/parameter[@name='p1']" name="managedType">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='retainAll']/parameter[@name='p0']" name="managedType">System.Collections.ICollection</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='removeAll']/parameter[@name='p0']" name="managedType">System.Collections.ICollection</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='containsAll']/parameter[@name='p0']" name="managedType">System.Collections.ICollection</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='addAll' and count(parameter)=1]/parameter[@name='p0']" name="managedType">System.Collections.ICollection</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='addAll' and count(parameter)=2]/parameter[@name='p1']" name="managedType">System.Collections.ICollection</attr>

  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='set']/parameter[@name='p1']" name="managedType">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='set']" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='get']" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='remove' and count(parameter)=1 and parameter[1][@type='int']]" name="managedReturn">Java.Lang.Object</attr>

  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='subList']" name="managedReturn">System.Collections.IList</attr>

  <attr path="/api/package[@name='org.mapsforge.android.maps.mapgenerator']/class[@name='MapGeneratorJob']/method[@name='compareTo']/parameter[@name='p0']" name="managedType">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.core']/class[@name='GeoPoint']/method[@name='compareTo']/parameter[@name='p0']" name="managedType">Java.Lang.Object</attr>
</metadata>

但是出现了许多新错误——所有方法都需要泛型集合:

error CS1502: The best overloaded method match for  "Mapsforge.Android.Maps.OverlayNs.OverlayList.AddAll(int, System.Collections.ICollection)" has some invalid arguments   
error CS1503: Argument "2": cannot convert from "System.Collections.Generic.ICollection<Mapsforge.Android.Maps.OverlayNs.Overlay>" to "System.Collections.ICollection"     
error CS1502: The best overloaded method match for "Mapsforge.Android.Maps.OverlayNs.OverlayList.AddAll(System.Collections.ICollection)" has some invalid arguments    
error CS1503: Argument "1": cannot convert from "System.Collections.Generic.ICollection<Mapsforge.Android.Maps.OverlayNs.Overlay>" to "System.Collections.ICollection"     
error CS1502: The best overloaded method match for "Mapsforge.Android.Maps.OverlayNs.OverlayList.ContainsAll(System.Collections.ICollection)" has some invalid arguments    
error CS1503: Argument "1": cannot convert from "System.Collections.Generic.ICollection<object>" to "System.Collections.ICollection"     
error CS1502: The best overloaded method match for "Mapsforge.Android.Maps.OverlayNs.OverlayList.RemoveAll(System.Collections.ICollection)" has some invalid arguments    
error CS1503: Argument "1":  cannot convert from "System.Collections.Generic.ICollection<object>" to "System.Collections.ICollection"     
error CS1502: The best overloaded method match for "Mapsforge.Android.Maps.OverlayNs.OverlayList.RetainAll(System.Collections.ICollection)" has some invalid arguments    
error CS1503: Argument "1": cannot convert from "System.Collections.Generic.ICollection<object>" to "System.Collections.ICollection"     
error CS0266: Cannot implicitly convert type "System.Collections.Generic.IList<Mapsforge.Android.Maps.OverlayNs.Overlay>" to "System.Collections.IList".    
error CS0266: Cannot implicitly convert type "System.Collections.Generic.IList<Mapsforge.Android.Maps.OverlayNs.Overlay>" to "System.Collections.IList".

如果我将类型从 System.Collections.ICollection 更改为 System.Collections.Generic.ICollection 它会生成“未实现”错误。我能做些什么来解决这个问题?

4

2 回答 2

1

在我上一个 Xamarin android 项目中,我遇到了同样的问题,因为我必须绑定一个大量使用 Java 泛型的 JAR。

首先,您可以阅读以下已在 bugzilla 上公开的错误 ( https://bugzilla.xamarin.com/show_bug.cgi?id=19740 ),与 Java 泛型的绑定问题相关。在该线程中,解释了 Android Callable Wrappers 生成器的限制,以及如果您需要绑定使用 Java 泛型的 Jar 可以实现的可能解决方案。

在我看来,只有当您的 Jar 没有大量使用泛型时,该解决方案才适用,这意味着如果您只有一个泛型类,那么这可能是最好的解决方案。

为了克服最初的问题,我使用了另一种方法,因为我绑定的 Jar 使用了几个我需要在 Xamarin 项目中调用的泛型类。我的方法只是在本地工作。这意味着将您的 Jar 包含在使用特定类型扩展泛型类的 Java 项目中。

注意:这个实现的要求是你必须知道你需要的泛型类型。

为了清楚起见,假设您的原始 JargenericJar包含一个名为 的泛型类Event<T>,并假设您知道 T 可以是“A”类型或“B”类型。

您需要做的是创建一个包含 Jar 的 Java 项目,然后在该项目中创建以下类:

  • public class EventA extends Event <A>{...}
  • public class EventB extends Event <B>{...}

完成此操作后,您将从此 java 项目创建一个 Jar,并将其用作 Xamarin Android 项目的起始 Jar。绑定项目会尝试绑定原来的Event<T>类,给你原来的错误。为避免这种情况,您必须在Metadata.xml绑定项目内部工作。在里面Metadata.xml你必须添加以下行来告诉 Xamarin 避免绑定泛型类:

<remove-node path="/api/package[@name='com.originalJar.event']" />

完成此操作后,您将能够生成 Xamarin 项目所需的 DLL,您将能够在其中使用 EventA 和 EventB 类,避免泛型问题。

我发现这是目前绑定 Java 泛型类的最佳方法,让我知道这是否可以帮助您解决问题;)

于 2016-10-28T15:36:45.090 回答
0

我找到了解决方案(它有效!!!)

首先:删除所有 OverlayList 节点并添加:

<remove-node path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']" />

这消除了直接使用 OverlayList 的能力,但允许库工作。

于 2013-09-24T19:07:48.717 回答