今天群里面有兄弟伙说第三方库用不起。说实话在我觉得第三方库能成功的几率大于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

13、最新安卓Xamarin绑定相关填坑之旅的更多相关文章

  1. https填坑之旅

    Boss说,我们买了个权威证书,不如做全站式的https吧,让用户打开主页就能看到受信任的绿标.于是我们就开始了填坑之旅. [只上主域好不好?] 不好...console会报出一大堆warning因为 ...

  2. stm32填坑之旅 - stm32f103c8t6点亮板载贴片蓝色LED

    转载请注明:https://www.cnblogs.com/rockyf/p/11691622.html 开篇 开篇一定要精彩,不然路人不理睬!下述是笔者作为arm小白的填坑之旅 没错,这个之前一直从 ...

  3. bootstrap-table填坑之旅<一>认识bootstrap-table

    应公司需求,改版公司ERP的数据显示样式.由于前期开发的样式是bootstrap,所以选bootstrap-table理所当然(也是因为看了bootstrap-table官网的example功能强大, ...

  4. React Native填坑之旅--Flow篇(番外)

    flow不是React Native必会的技能,但是作为正式的产品开发优势很有必要掌握的技能之一.所以,算是RN填坑之旅系列的番外篇. Flow是一个静态的检查类型检查工具,设计之初的目的就是为了可以 ...

  5. React Native填坑之旅--与Native通信之iOS篇

    终于开始新一篇的填坑之旅了.RN厉害的一个地方就是RN可以和Native组件通信.这个Native组件包括native的库和自定义视图,我们今天主要设计的内容是native库方面的只是.自定义视图的使 ...

  6. React Native填坑之旅--布局篇

    代码在这里: https://github.com/future-challenger/petshop/tree/master/client/petshop/src/controller 回头看看RN ...

  7. 使用vue开发微信公众号下SPA站点的填坑之旅

    原文发表于本人博客,点击进入使用vue开发微信公众号下SPA站点的填坑之旅 本文为我创业过程中,开发项目的填坑之旅.作为一个技术宅男,我的项目是做一个微信公众号,前后端全部自己搞定,不浪费国家一分钱^ ...

  8. [Xamarin]我的Xamarin填坑之旅(二)

    上一篇交代了我Xamarin填坑的背景,大概聊了聊第一步环境配置,第二步创建项目和开发框架选择.如果有一个可用的梯子,这部分基本不会出错. 接下来就具体聊一聊写代码的过程中遇到的一些事儿. 第三步是码 ...

  9. React Native填坑之旅--ListView篇

    列表显示数据,基本什么应用都是必须.今天就来从浅到深的看看React Native的ListView怎么使用.笔者写作的时候RN版本是0.34. 最简单的 //@flow import React f ...

随机推荐

  1. s5-15 开放的最短路径优先_OSPF

    L-S路由协议的实例—OSPF 开放的路径优先(Open Shortest Path First) 使用图(graph)来表述真实的网络 - 每个路由器/Lan都是一个节点 - 测量代价/量度(met ...

  2. RNN与应用案例:注意力模型与机器翻译

    1. 注意力模型 1.2 注意力模型概述 注意力模型(attention model)是一种用于做图像描述的模型.在笔记6中讲过RNN去做图像描述,但是精准度可能差强人意.所以在工业界,人们更喜欢用a ...

  3. Effective C++ 随笔(5)

    条款27:尽量稍作转型动作 const_cast:常量性移除 dynamic_cast:安全向下转型 reinterpret_cast: static_cast: 如在子类当中享调用父类当中的某个方法 ...

  4. CMake和静态库顺序

    目录 目录 1 前言 1 方法 1 附1:链接静态库的顺序问题 2 附2:再议GCC编译时的静态库依赖次顺问题 3 附3:gcc链接参数--whole-archive的作用 4 附4:让有些“-l”链 ...

  5. css3实现卡牌旋转与物体发光效果

    效果演示 http://demo.qpdiy.com/hxw/CSS3/rotate+light.html 物体旋转: 卡牌同一位置放2张图片,通过设置3D动画旋转实现 animation: card ...

  6. 网络timeout区分

    ConnectTimeout 连接建立时间,三次握手完成时间 SocketTimeout 数据传输过程中数据包之间间隔的最大时间 下面重点说下SocketTimeout,比如有如下图所示的http请求 ...

  7. 区间DP石子合并问题 & 四边形不等式优化

    入门区间DP,第一个问题就是线性的规模小的石子合并问题 dp数组的含义是第i堆到第j堆进行合并的最优值 就是说dp[i][j]可以由dp[i][k]和dp[k+1][j]转移过来 状态转移方程 dp[ ...

  8. SRM476

    250pt 题意:饲养N<=50只Badgers,每只食量是X[i],当没看到别的一只Badgers吃东西时,它的食量就会增加Y[i],现在一共用P的粮食,问最多能养的起多少只獾. 思路:枚举一 ...

  9. ASP.NET Web API 框架研究 ASP.NET Web API 路由

    ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...

  10. map 小模板~~~ 写的不好 继续添加

    #include<map>#include<string.h>#include<iostream>using namespace std; int main(){  ...