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 种方法 ...
随机推荐
- .NET 串口通信
这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...
- Content Security Policy 入门教程
阮一峰文章:Content Security Policy 入门教程
- Paypal开发中遇到请求被中止: 未能创建 SSL/TLS 安全通道及解决方案
最近在基于ASP.NET上开发了Paypal支付平台,在ASP.NET开发的过程中没有遇到这个问题,但是引用到MVC开发模式中的时候就出现了"未能创建 SSL/TLS 安全通道及解决方案&q ...
- OpenCV人脸识别LBPH算法源码分析
1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...
- 来吧,HTML5之一些注意事项
1.说什么是HTML HTML是一种超文本标记语言(Hyper Text Markup Language), 标记语言是一套标记标签(markup tag),用来描述网页的非编程语言. 2.标签特性: ...
- 在vim中使用查找命令查找指定字符串
要自当前光标位置向上搜索,请使用以下命令: /pattern Enter 其中,pattern 表示要搜索的特定字符序列. 要自当前光标位置 ...
- [开发笔记]yum错误
yum 错误TypeError: rpmdb open failed 解决办法 是因为RPM数据库出现损坏导致的,它导致所有的软件的升级.安装甚至是删除都会出现问题,终端出现乱码,YUMEX也用不成, ...
- gRPC源码分析1-SSL/TLS
引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...
- SQL Server 2014聚集列存储索引
转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...
- MySQL:常见使用问题
内容 1.Linux 上安装 MySQL 2.单机上安装多实例 3.不知root密码情况下,修改root密码 1.Linux 上安装MySQL 安装步骤: 1)解压 tar.gz文件 -linux-g ...