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

绑定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. SQL:指定名称查不到数据的衍伸~空格 换行符 回车符的批量处理

    异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html 先看看啥情况 复制查询到的数据,粘贴一下看看啥情况 那就批量处理一下~ 就这样 ...

  2. centos7+mono4+jexus5.6.2安装过程中的遇到的问题

    过程参考: http://www.linuxdot.net/ http://www.jexus.org/ http://www.mono-project.com/docs/getting-starte ...

  3. 深入理解CSS中的margin负值

    前面的话 margin属性在实际中非常常用,也是平时踩坑较多的地方.margin折叠部分相信不少人都因为这样那样的原因中过招.margin负值也是很常用的功能,很多特殊的布局方法都依赖于它.它看似简单 ...

  4. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  5. 应该是Angular2的一个bug?

    为了应对未来的趋势,及时赶上下一趟互联网技术,我最近也在通过具体项目研究angular2,首先必须要吐槽的是,学习angular2的成本本身不高,但是一堆的工具.配置实在让人 很是焦灼,就像asp.n ...

  6. 初识JavaScript

    JavaScript ECMA-262: 变量,函数,对象,数据类型....唯独没有输入和输出. Javascript:包含 ECMA-262,核心 BOM 浏览器对象模型, DOM 文档对象模型 什 ...

  7. 【HTML】Html页面跳转的5种方式

    目录结构: // contents structure [-] html实现 javascript方式实现 结合了倒数的javascript实现(IE) 解决Firefox不支持innerText的问 ...

  8. Ubuntu下配置apache开启https

    一.HTTPS简述随着网络的日常,信息安全越来越重要,传统的网站都是http协议明文传输,而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,比http协议安全. 那ht ...

  9. [Django]用户权限学习系列之权限管理界面实现

    本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...

  10. UGUI Text(Label)

    环境 Unity 5.3.6f1 关于Best Fit 如果勾选了 Best Fit ,当有大量的文本填充在Text上时,那么文字是不会自动换行的. 打字机效果 在github上已有现成的:https ...