zoukankan      html  css  js  c++  java
  • 13、最新安卓Xamarin绑定相关填坑之旅

    今天群里面有兄弟伙说第三方库用不起。说实话在我觉得第三方库能成功的几率大于90% 除了极少数恶心的库以外。

    绝大部分第三方库都还是可以绑定好的

    https://github.com/youzan/YouzanMobileSDK-Android

    这个是官方的也有对应的demo

    首先遇到绑定库 我会第一时间nuget查询下 虽然这种库很少有人会用。但是万一有人绑定了呢?

    然后 我会在github搜索下有木有好心的人绑定了

    这2个方法后都没得人绑定 好吧 那就我自己开撸

    首先安卓的绑定绝对比ios绑定容易得多 耐心细心慢慢来肯定可以解决

    先下载官方的 用as打开跑起来  没问题 好的 官方无坑。 (一定记得这一步 不然万一官方的有坑你自己又在撸会哭的)

    接下来 准备一个2个工具  ILSpy.exe     Jd-gui.exe

    然后先看下官方依赖的库有那些 这一步很重要

    用相关的gradlew 去查看相关依赖 具体百度 Android Studio 依赖查看

    目前我查出来依赖了

    systemweb-2.0.9

    sdk-analytics-0.4.7
    youzansdk-6.3.5
    anko-commons-0.10.0
    anko-sqlite-0.10.0
    gson-2.8.0
    okhttp-3.8.1
    okio-1.13.0
    basic-6.3.5

    webcache-2.2.0

    jsbridge-2.0.2

    这里面如果是aar 记得要单独建一个绑定类库

    开始绑定

    第一步绑定basic-6.3.5 .aar 的时候就发现有个YouzanBrowser类无法生成 这个时候 打开

    查看所有文件

    打开这个文件夹 然后查看 里面有个 classs.jar  用jd-gui.exe 工具反编译查看下类的结构

    然后用xml语法进行编辑修改  请记住 官方的自动生成只是简化这个步骤而已. 对写得很好的库完全没问题  但是有些国内厂商写得并不好 一堆乱 意味着你就放弃掉这些好了 直接自己来写

    首先remove-node 移除掉编译出错的节点

    <remove-node path="/api/package[@name='android.support.v4.content']/class[@name='CursorLoader']/method[@name='loadInBackground']" />
    语法是 xpath 语法 操作的对象是什么对象呢?  是一个xml文件

     api.xml  是工具帮你生成的 有时候你记不住语法 可以参考下

    api.xml.fixed  是经过修改后生成的(经过你的xpath处理 也就是一直在说的Metadata.xml 文件)

    好了 其他都不重要 记住 如果你发现编译一堆语法错误 首先 直接remove掉这些节点和错误的类

    然后根据项目需要那些api方法和类 直接自己生成

    我们需要YouzanBrowser 这个对象 用jd-gui打开对应的class.jar

    这不是我们需要的类吗?为什么生成不了? 大部分都是因为依赖的第三方库 第三方的类和对象无法解析 接口实现等 都会有这个问题。我们不管先看下

    涂抹的内容不重要

    只看一个Package  class名字 继承关系

    <add-node path="/api/package[@name='com.youzan.androidsdk.basic']">
        <class abstract="false" deprecated="not deprecated" extends="android.webkit.WebView" extends-generic-aware="java.lang.Object" final="false" name="YouzanBrowser" static="false" visibility="public">
          
        </class>
      </add-node>

     这里面的名字 大家英文好 看看就行  需要注意的是2个东西

     extends 如果没有特殊的需要可以不用继承特定的类型 直接继承Object 即可   但是我们这里由于需要一个特定类型的 在代码里面 所以设定他继承 android.webkit.WebView  具体的类型大家可以看他jd-gui 的源码

    然后就是添加需要的方法

      <constructor deprecated="not deprecated" final="false" name="YouzanBrowser" static="false"  visibility="public">
            <parameter name="context" type="android.content.Context">
            </parameter>
          </constructor>
          <method abstract="false" deprecated="not deprecated" final="false" name="pageGoBack" native="false" return="boolean" static="false" synchronized="false" visibility="public">
            
          </method>
          <method abstract="false" deprecated="not deprecated" final="false" name="reload" native="false" return="void" static="false" synchronized="false" visibility="public">
    
          </method>
          <method abstract="false" deprecated="not deprecated" final="false" name="onPause" native="false" return="void" static="false" synchronized="false" visibility="public">
    
          </method>
    
          <method abstract="false" deprecated="not deprecated" final="false" name="destroy" native="false" return="void" static="false" synchronized="false" visibility="public">
    
          </method>
          <method abstract="false" deprecated="not deprecated" final="false" name="onResume" native="false" return="void" static="false" synchronized="false" visibility="public">
    
          </method>
          <!--boolean receiveFile(int paramInt, Intent paramIntent);-->
          <method abstract="false" deprecated="not deprecated" final="false" name="receiveFile" native="false" return="void"
                 static="false" synchronized="false" visibility="public">
            <parameter name="paramInt" type="int">
            </parameter>
            <parameter name="paramIntent" type="android.content.Intent">
            </parameter>
          </method>
          <method abstract="false" deprecated="not deprecated" final="false" name="loadUrl" native="false" return="void"
                  static="false" synchronized="false" visibility="public">
            <parameter name="paramString" type="java.lang.String">
            </parameter>
          </method>

     这样非常简单根据反编译出来的对象 类型进行调整和命名即可 也不用扣破头的想生成的咋不对呢 等等问题.  接口也是类似的处理逻辑

    如果编译不通过 可以查看输出 里面会有详细的提示

    把所有的绑定编译通过后  记得 加入相关依赖库 就是你最初查找出来的

    有时候智能提示会出现卡壳  那怎么知道我要的类是否生成出来? 可以借助IlSpy 看下 如果出来了 即使 demo里面有波浪号也不管他 只管编译即可

    开始写个demo跑跑看

    开始遇到第一个深坑。

      java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;

    第一个崩溃的异常出现 。查询任何资料都没有Xamarin相关的介绍。你会觉得神经病啊 啥垃圾Xamarin。。。 其实不是 如果你做安卓原生开发就会知道 使用kotlin的库的时候 java这边需要引入一个stblib

    我们Xamarin早就提供了 nuget 搜索下 

    加入这个库再运行 就不会报错了

    至此整个流程完毕

    如果运行过程出现

    Java.Lang.NoClassDefFoundError: Failed resolution of: Lorg/jetbrains/anko/db/ManagedSQLiteOpenHelper;
     
     
    NoClassDefFoundError  请检查下依赖的第三方jar 是否已经打在你绑定库里面   记得 一定要先清理 再编译 否则 会让你觉得崩溃 明明添加了 结果还是 没找到 记得清空
     
    跑下吧 
    我 已经放在github上了

       

    https://github.com/jsonsugar/XamainAndroidBindLibary

     

  • 相关阅读:
    Vcenter虚拟化三部曲----SQL Server 2008 R2 数据库安装
    Vcenter虚拟化三部曲----VMWare ESXi 5.5安装及配置
    SaltStack 自动化工具
    KVM虚拟化
    redis单节点集群
    linux--yum源,源码包
    运维工程师常用命令(持续更新)
    TARS基金会:构建微服务开源生态
    TarsGo新版本发布,支持protobuf,zipkin和自定义插件
    .NET 发送电子邮件
  • 原文地址:https://www.cnblogs.com/jasondun/p/9215572.html
Copyright © 2011-2022 走看看