Xamarin 绑定jar解决问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31403321/article/details/79502182

Xamarin 绑定jar解决问题

在绑定jar或者aar包的时候,肯定会出现各种错误吧,如果没有报错那么只能说明这个jar包没有冲突,所以如果报错那么纯属正常,不报错的插件不是好插件,废话不多说,我们先来看怎么解决错误吧。

官方文档:https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/customizing-bindings/java-bindings-metadata/

首先你按照这个步骤很优雅的导入jar包:点击跳转

然后在生成的时候会报错吧。其实在导入百度地图的SDK就有报错,也解决了问题,但是可能不知道怎么解决的吧,就是无脑的粘贴复制。Xamarin.Android 百度地图SDK

最后解决的方式在:Metadata.xml文件中加入了一下代码,就解决了:

 <attr path="/api/package[@name='com.baidu.mapapi.map']/interface[@name='BaiduMap.OnMapStatusChangeListener']/method[@name='onMapStatusChangeStart' and count(parameter)=2 and parameter[1][@type='com.baidu.mapapi.map.MapStatus'] and parameter[2][@type='int']]" name="managedName">OnMapStatusChangeStart2</attr>
 <attr path="/api/package[@name='com.baidu.mapapi.map']/interface[@name='BaiduMap.OnMapStatusChangeListener']/method[@name='onMapStatusChangeStart' and count(parameter)=2 and parameter[1][@type='com.baidu.mapapi.map.MapStatus'] and parameter[2][@type='int']]" name="managedName">OnMapStatusChangeStart2</attr>

那这些到底是什么意思呢?

然后我们来解读Xamarin中的Metadata.xml的用法

首先这个文件中,根节点是以下:

  • add-node – 将一个子节点附加到由path属性指定的节点上
  • attr – 设置由path属性指定的元素的属性值。
  • remove-node – 删除匹配指定XPath的节点

看下例子Metadata.xml

<metadata>

    <attr path="/api/package[@name='com.evernote.android.job']" 
        name="managedName">Evernote.AndroidJob</attr>


    <remove-node path="/api/package[@name='com.evernote.android.job.v14']" />
    <remove-node path="/api/package[@name='com.evernote.android.job.v21']" />


    <attr path="/api/package[@name='com.evernote.android.job']/class[@name='JobManager']/method[@name='forceApi']/parameter[@name='p0']" 
        name="name">api</attr>
</metadata>

下面列出了一些常用的用于Java API的元素:

  • interface – 用于定位到Java接口 /interface[@name='AuthListener'].
  • class – 用于定位到某个类 /class[@name='MapView'].
  • method – 用于在Java类或接口上定位到方法 /class[@name='MapView']/method[@name='setTitleSource'].
  • parameter – 为方法确定一个参数/parameter[@name='p0']

添加类型

<add-node path="/api/package[@name='org.alljoyn.bus']">
    <class abstract="false" deprecated="not deprecated" final="false" name="AuthListener.AuthRequest" static="true" visibility="public" extends="java.lang.Object">
        <constructor deprecated="not deprecated" final="false" name="AuthListener.AuthRequest" static="false" type="org.alljoyn.bus.AuthListener.AuthRequest" visibility="public" />
        <field name="p0" type="org.alljoyn.bus.AuthListener.Credentials" />
    </class>
</add-node>

org.alljoyn.bus包中添加一个类,类名为:AuthRequest,不抽象,不弃用,不为final,是个静态的,可见性为public,父类为Object

然后下面是个constructor这节点,说明生成一个构造器,然后需要传入一个参数,名字为p0,类型为:Credentials

删除类型

<remove-node path="/api/package[@name='{package_name}']/class[@name='{name}']" />

更换名称

<attr path="/api/package[@name='android']/class[@name='Manifest']" 
name="name">NewName</attr>

如果报错说什么已经定义了,冲突了,就是有名称重复了,就可以更换名称。这里是把Manifest类名改成了NewName

最后编译后,是这样的:

[Register ("android/NewName")]
public class NewName : Java.Lang.Object { ... }

如果要设置包名可以这样写:

<attr path="/api/package[@name='android']" name="managedName">NewName</attr>

当然这种方法也可以设置类名和方法名,通用。还是很强大的

更换类名

有时候编译也会出现类型转换错误

<attr path="/api/package[@name='de.neom.neoreadersdk']/
class[@name='Resolution']/
method[@name='compareTo' and count(parameter)=1 and
parameter[1][@type='de.neom.neoreadersdk.Resolution']]/
parameter[1]"name="managedType">Java.Lang.Object</attr>

这里的意思是让compareTo方法传入的参数为Object

设置返回参数

<attr path="/api/package[@name='android.text']/
class[@name='SpannableStringBuilder']/
method[@name='append']" 
name="managedReturn">Java.Lang.IAppendable</attr>

和上面一个,只不过返回的类型设置为IAppendable

生成Get 和 Set 方法

<attr path="/api/package[@name='org.java_websocket.handshake']/class[@name='HandshakeImpl1Client']/method[@name='setResourceDescriptor' 
and count(parameter)=1 
and parameter[1][@type='java.lang.String']]" 
name="propertyName"></attr>
<attr path="/api/package[@name='org.java_websocket.handshake']/class[@name='HandshakeImpl1Client']/method[@name='getResourceDescriptor' 
    and count(parameter)=0]" 
    name="propertyName"></attr>

注意,setter和getter方法仍然是由绑定生成器创建的

这几个比较常用,如果上面这些还是满足不了你的需要,可以通过官网查看,这里有连接,点击直接进入就好。
https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/customizing-bindings/java-bindings-metadata/

阅读更多

扫码向博主提问

Wyndem

非学,无以致疑;非问,无以广识
去开通我的Chat快问
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页