最近一个项目涉及到较多的第三方库的绑定技术,中间遇到了几个坑,记录下来与大家分享

绑定Jar库

monoandroid对原生库的调用都通过Android.Runtime.JNIEnv进行调入(http://docs.xamarin.com/guides/android/advanced_topics/java_integration_overview/working_with_jni/),例如Android.App.Activity类只是封装好了大量的JNIEnv对Davlik的调用,而对于开发人员自己绑定的库则由ide自动生成ACW,如果类继承了JavaObject由于需要Davlik虚拟机调用相应的方法则会生成相应的java代码(MCW).在对一个第三方库进行绑定时遇到的问题是相应的java库中有一个方法对传入的list进行了改变而没有返回值,建立的Jar Binding项目生成的方法是普通的传值方式而不是ref或者out,查找mono的文档在metadata.xml中设置成pass_as但是无效(ref),由于项目比较急当时想了一个折中的方法是对第三方库进行二次封装,在二次封装的库中返回值,折腾了半天Android Studio(吐槽:gradle是又慢建立库又麻烦)终于搞定,后来翻看官方的文档(http://docs.xamarin.com/guides/android/advanced_topics/api_design/)发现官方提供了copyless marshaling的类,测试使用后正常。

绑定C++开发的ios静态库

另一个坑发生在绑定一个ios平台的静态库上面,该静态库使用C++开发,根据提供的demo代码封装了一个ios版本的static lib,建立ios的测试程序运行成功。但是绑定后一直提示找不到一些libssh2的方法,刚开始的思路是去github下载相应的库编译添加但是还是报错,与xamarin的支持工程师邮件联系说是需要库开发商提供相应的库,联系厂商工程师反馈没有对相应的库的依赖,分析认为是绑定库的设置有问题但是多次测试不同的monotouch argmument都没有效果, 为了分析出相应的报错的方法的出处。根据以往查看dll的方法的思路找到了一个查看ios库的工具:MachOView(后发现使用自带的nm命令也行).查看出再相应的静态库中确实有对应的方法,继续与库开发商沟通但是那边检查了一遍还是没有找到相应的依赖。进一步分析build log发现xamarin studio进行编译的时候对相应的库进行了force_load,google开了一下force_load和all_load的相关信息,原来使用这个参数的话会强制libtool加载所有的签名。将相应的信息提供给xamarin的工程师,工程师反馈使用SmartLink属性,测试成功。去查了一下SmartLink相关的信息发现开启该标示后后编译器会分析相应的引用并只加载相关的symbol。来回折腾了10多天终于搞定了,从中得出的经验就是要使用已有经验一步步的向下分析才能解决问题。

补充:后面又发现一个坑,绑定另一个视频相关的库的时候提示Duplicate symbol,然后用nm工具看了一下确实有两个一样名字的方法,google了一下需要设置编译参数dead_strip,再monouthch中设置为-gcc_flags="-stdlib=libstdc++   -dead_strip"后正常

xamarin绑定原生库的一些坑的更多相关文章

  1. Xamarin 绑定安卓第三方库恢复原始参数问题

    大家都知道在绑定xamarin android 第三方库的时候 参数名是乱码的 变成了p1  p2  p3 之类的 这样在实际使用的时候非常不方便. 其实xamarin是提供了三种方式帮助大家恢复ja ...

  2. 从零开始学Xamarin.Forms(四) Android 准备步骤(添加第三方Xamarin.Forms.Labs库)

    原文:从零开始学Xamarin.Forms(四) Android 准备步骤(添加第三方Xamarin.Forms.Labs库)  1.安装对应dll     Update-Package Xama ...

  3. Android Studio添加原生库并自动构建

    [时间:2017-09] [状态:Open] [关键词:Android,Android Studio,gradle,native,c,c++,cmake,原生开发,ndk-build] 0 引言 最近 ...

  4. Android Studio原生库创建示例

    [时间:2017-07] [状态:Open] [关键词:Android,Android Studio,gradle,native,c,c++,cmake,原生开发] 0 引言 最近在工作中遇到了升级A ...

  5. vuejs给组件绑定原生事件

    给组件绑定事件,该事件是自定义的事件 <div id='root'> <child @click='handleClick'></child> </div&g ...

  6. iOS 原生库对 https 的处理

    转载自:swift cafe 使用 NSURLSession NSURLSession 是 iOS 原生提供的网络处理库.它提供了丰富的接口以及配置选项,满足我们平时网络处理的大部分需求,同时它也支持 ...

  7. vue怎么给自定义组件绑定原生事件

     下面主要以4个示例Demo演示(示例代码JS引用的Vue CDN),建议小伙伴直接复制示例代码运行查看, 赶时间的小伙伴可直接往下拉,看示例demo4 注:全局或局部注册的组件称为子组件,其中声明的 ...

  8. vue组件绑定原生事件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. MyBatis原生批量插入的坑与解决方案!

    前面的文章咱们讲了 MyBatis 批量插入的 3 种方法:循环单次插入.MyBatis Plus 批量插入.MyBatis 原生批量插入,详情请点击<MyBatis 批量插入数据的 3 种方法 ...

随机推荐

  1. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  2. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  3. .Net多线程编程—预备知识

    1 基本概念 共享内存的多核架构:一个单独的封装包内封装了多个互相连接的未处理器,且所有内核都可以访问主内存.共享内存的多核系统的一些微架构,例如内核暂停功能,超频. 内核暂停功能:当使用内核不多的时 ...

  4. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  5. 【干货分享】流程DEMO-采购预算编制

    流程名: 采购预算编制  业务描述: 在月初由计财部进行预算编辑,提交审批后预算生效  流程相关文件: 流程包.xml WebService业务服务.xml WebService.asmx WebSe ...

  6. 热修复-Tinker

    微信开源,真是喜出望外,必须要去看看啊,比起nuwa来微信好很多,而且github上也有专门的官方文档说明,还有很多资料查询 参考地址:https://github.com/Tencent/tinke ...

  7. 【iOS10 SpeechRecognition】语音识别 现说现译的最佳实践

    首先想强调一下“语音识别”四个字字面意义上的需求:用户说话然后马上把用户说的话转成文字显示!,这才是开发者真正需要的功能. 做需求之前其实是先谷歌百度一下看有没有造好的轮子直接用,结果真的很呵呵,都是 ...

  8. TFS2013 设置签出独占锁

    转载自: http://www.cnblogs.com/zhang888/p/4280251.html

  9. mysql 5.7中的用户权限分配相关解读!

    这篇文章主要介绍了MySQL中基本的用户和权限管理方法,包括各个权限所能操作的事务以及操作权限的一些常用命令语句,是MySQL入门学习中的基础知识,需要的朋友可以参考下 一.简介 各大帖子及文章都会讲 ...

  10. Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)

    第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...