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

原文地址:https://www.cnblogs.com/jasondun/p/9215572.html

时间: 2024-08-02 13:43:44

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

bootstrap-table填坑之旅

应公司需求,改版公司ERP的数据显示样式.由于前期开发的样式是bootstrap,所以选bootstrap-table理所当然(也是因为看了bootstrap-table官网的example功能强大,样式清爽). 然后... ... 开启bootstrap-table填坑之旅. 开始就扒本园的资源,确实有不少bootstrap-table的文章.确实写的不错很详细,请恕本菜实在菜了点,看了半天demo的页面都没弄出来(勿吐槽~~).终于11点了.. .. 于是决定跟着官网的小白教程一点点的玩.

H5嵌入原生开发小结----兼容安卓与ios的填坑之路

一开始听说开发H5,以为就是做适配现代浏览器的移动网页,心想不用管IE了,欧也.到今天,发现当初too young too simple,兼容IE和兼容安卓与IOS,后者让你更抓狂.接下来数一下踩过的坑.主要分UI展示,键盘,输入框等等.解决bug最苦恼的问题不是没有解决方案,而是你没有找到真正的原因.再就是现象难以重现,每次都要发布代码,然后到手机app中去测试,模拟.这些地方会耗费大量的精力. 一.UI相关 1.安卓4.4以下不支持fixed布局. fixed布局的作用之一就是在手机键盘弹起

[原创]CentOS7编译安装OpenResty1.15.8.2(填坑之旅)

原创文章,转载请注明出处:https://blog.51cto.com/indian/2445786 一.安装前置环境 1.编译工具安装 yum install -y epel-release yum install -y gcc gcc-c++ curl 2.调整系统时区 date timedatectl sudo timedatectl set-timezone Asia/Shanghai sudo dnf install -y chrony 3.其它自己需要的工具 yum install

RMI的填坑之旅

前几天对一个业务系统做了一下RMI的集成, 一切都挺顺利, 本地测试通过, 但是今天该业务系统部署到服务器上却出现了连接不上的情况. Connection refuse !!! 认真一看, 发给A服务器的调用却最后发给了B服务器. Debug了好久就是lookup()的方法直接返回了B服务器地址, 当时就一直考虑A服务器是不是有内部转发给B, Linux 下tcpdump tcp port 1099(RMI端口)  看了, Windows 下pathping ip也看了, 就是没看到跳转到B服务

IOS-开发小记 填坑之旅

很多知识点,并不难.只是,根本不知道这个概念,每次都要探坑后,才会知道有这个东西. ld: symbol(s) not found for architecture x86_64 在.o 文件 中 找不到定义. oc编译是先编译出.o文件,再链接. 如果在.h 声明,在.m没有实现,便会找不到符号(symbol).不用就没关系. restoration identifier 和 reuse identifier 不一样. restoration identifier 是恢复用的. reuseId

Node学习笔记(四):gulp+express+io.socket部署angularJs2(填坑篇)

这篇就先暂停下上篇博客--你画我猜的进度,因为在做这个游戏的时候,想采用最新的ng2技术,奈何坑是一片又一片,这边就先介绍下环境部署和填坑史 既然要用ng2,首先要拿到资源,我这边用的是angularJs2 beta版的,网上的资源有两种,一个是文件全压缩版的.min.js版的另一个就是一大堆乱七八糟的js文件,主要是ng2已经完全采用TypeScript,加之对es6的支持,所以需要引入一大堆兼容,编译文件 这边刚好特别手欠想学学gulp,于是开搞配置gulp环境,压缩所有的js文件成一个mi

初涉node.js做微信测试公众号一路填坑顺便发现个有趣的其他漏洞

[微信测试公众号] 半年前耍着玩搭起来的“微信简历”,是LAMP版的,很皮毛. 微信的官方文档在这 http://mp.weixin.qq.com/wiki/index.php 1.获取access token 2.自定义菜单创建,直接在调试工具上做了 http://mp.weixin.qq.com/debug 3.接入指南(接入自己的网站) 4.接收微信消息,判断消息类型,判断消息关键字(比如来自哪个按钮),响应消息 这里有个小坑,不同类型的消息数据结构略有不同,判空最好做细致点. [V2.0

Vue2.0 新手完全填坑攻略——从环境搭建到发布

本文作者 Jinkey(微信公众号 jinkey-love,官网 https://jinkey.ai) 原文链接 https://jinkey.ai/post/tech/vue2.0-xin-shou-wan-quan-tian-keng-gong-lue-cong-huan-jing-da-jian-dao-fa-bu 文章允许非篡改署名转载,删除或修改本段版权信息转载的,视为侵犯知识产权,我们保留追求您法律责任的权利,特此声明! 感谢 showonne.yubang 技术指导 Demo 地址

填坑系列:通过ESXi来配置IPMI

近日西安的天气很不错,可是看到从其他地方迁移来的主机在新环境下无法远程调试怪郁闷的,这就需要填坑,要不就会给后来者挖更大的坑. 今天遇到的坑是在IPMI的网络设置里面启用了VLAN标签之后,在新环境下IPMI直接失灵的问题. 由于时间原因,当时迁移的时候直接就断电了,很中国的理念是不——就是要快,先不看结果. 原有的环境是vSphere ESXi 4.1的操作系统,配置好IP之后可以通过vSphere Client去管理他,服务器是Supermicro的. 传统方式解决此问题需要还原出一个原有的