我正在尝试绑定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,则会生成“未实现”错误。我该怎么做才能解决这个问题?
答案 0 :(得分:1)
我在上一个Xamarin android项目中遇到了同样的问题,因为我必须绑定一个大量使用Java泛型的JAR。
首先,您可以阅读bugzilla上已经打开的以下错误(https://bugzilla.xamarin.com/show_bug.cgi?id=19740),相对于Java泛型的绑定问题。 在该线程中,解释了Android Callable Wrappers生成器的限制,以及在需要绑定使用Java泛型的Jar时可以实现的可能解决方案。
在我看来,只有当你的Jar没有大量使用泛型时,解决方案才适用,这意味着如果你只有一个泛型类,这可能是最好的解决方案。
为了克服原来的问题,我使用了另一种方法,因为我绑定的Jar使用了我需要在我的Xamarin项目中调用的几个泛型类。我的方法只是在原生方面工作。这意味着在Java项目中包含Jar,扩展具有特定类型的泛型类。
注意: 此实现的要求是您必须知道所需的泛型类型。
为了清楚起见,假设您原来的Jar genericJar
包含一个名为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泛型类的最佳方法,让我知道这是否可以帮助您解决问题;)
答案 1 :(得分:0)
我找到了解决方案(并且有效!!!)
首先:删除所有OverlayList节点并添加:
<remove-node path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']" />
这将删除直接使用OverlayList的功能,但允许库工作。