xamarin绑定原生库的一些坑
最近一个项目涉及到较多的第三方库的绑定技术,中间遇到了几个坑,记录下来与大家分享
绑定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绑定原生库的一些坑的更多相关文章
- Xamarin 绑定安卓第三方库恢复原始参数问题
大家都知道在绑定xamarin android 第三方库的时候 参数名是乱码的 变成了p1 p2 p3 之类的 这样在实际使用的时候非常不方便. 其实xamarin是提供了三种方式帮助大家恢复ja ...
- 从零开始学Xamarin.Forms(四) Android 准备步骤(添加第三方Xamarin.Forms.Labs库)
原文:从零开始学Xamarin.Forms(四) Android 准备步骤(添加第三方Xamarin.Forms.Labs库) 1.安装对应dll Update-Package Xama ...
- Android Studio添加原生库并自动构建
[时间:2017-09] [状态:Open] [关键词:Android,Android Studio,gradle,native,c,c++,cmake,原生开发,ndk-build] 0 引言 最近 ...
- Android Studio原生库创建示例
[时间:2017-07] [状态:Open] [关键词:Android,Android Studio,gradle,native,c,c++,cmake,原生开发] 0 引言 最近在工作中遇到了升级A ...
- vuejs给组件绑定原生事件
给组件绑定事件,该事件是自定义的事件 <div id='root'> <child @click='handleClick'></child> </div&g ...
- iOS 原生库对 https 的处理
转载自:swift cafe 使用 NSURLSession NSURLSession 是 iOS 原生提供的网络处理库.它提供了丰富的接口以及配置选项,满足我们平时网络处理的大部分需求,同时它也支持 ...
- vue怎么给自定义组件绑定原生事件
下面主要以4个示例Demo演示(示例代码JS引用的Vue CDN),建议小伙伴直接复制示例代码运行查看, 赶时间的小伙伴可直接往下拉,看示例demo4 注:全局或局部注册的组件称为子组件,其中声明的 ...
- vue组件绑定原生事件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- MyBatis原生批量插入的坑与解决方案!
前面的文章咱们讲了 MyBatis 批量插入的 3 种方法:循环单次插入.MyBatis Plus 批量插入.MyBatis 原生批量插入,详情请点击<MyBatis 批量插入数据的 3 种方法 ...
随机推荐
- 数学思想:为何我们把 x²读作x平方
要弄清楚这个问题,我们得先认识一个人.古希腊大数学家 欧多克索斯,其在整个古代仅次于阿基米德,是一位天文学家.医生.几何学家.立法家和地理学家. 为何我们把 x²读作x平方呢? 古希腊时代,越来越多的 ...
- Fis3的前端模块化之路[基础篇]
Fis3版本:v3.4.22 fis3是一个构建工具 解决前端开发中自动化工具.性能优化.模块化框架.开发规范.代码部署.开发流程等问题. 安装 npm install -g fis3 运行 fis3 ...
- 在 ML2 中配置 OVS flat network - 每天5分钟玩转 OpenStack(133)
前面讨论了 OVS local network,今天开始学习 flat network. flat network 是不带 tag 的网络,宿主机的物理网卡通过网桥与 flat network 连接, ...
- 应用工具 .NET Portability Analyzer 分析迁移dotnet core
大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易.如果您创建与 .NET Core 兼容的.NET 标准库,那么现在比以往任何时候 ...
- 一步步开发自己的博客 .NET版(10、前端对话框和消息框的实现)
关于前端对话框.消息框的优秀插件多不胜数.造轮子是为了更好的使用轮子,并不是说自己造的轮子肯定好.所以,这个博客系统基本上都是自己实现的,包括日志记录.响应式布局.评论功能等等一些本可以使用插件的.好 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- 【从零开始学BPM,Day3】自定义表单开发
[课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第三天课程] 1.课程概要 Step 1 软件下载:H3 BP ...
- HA 高可用软件系统保养指南
又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ...
- Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)
一. 准备工作 1. 树莓派主板 型号:树莓派3 B型 处理器:四核64位ARM Cortex-A53 CPU 内核架构:ARMv8 2. 一张大于8G的TF卡(本人用的是32G的,也作为PiLFS用 ...