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

绑定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. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  2. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

  3. xpath提取多个标签下的text

    title: xpath提取多个标签下的text author: 青南 date: 2015-01-17 16:01:07 categories: [Python] tags: [xpath,Pyth ...

  4. 通过 floating IP 访问 VIP - 每天5分钟玩转 OpenStack(126)

    前面我们是直接用 curl 测试 VIP,在更为真实的场景中通常会使用 floating IP 访问 VIP. 下面我们给 VIP 关联一个 floating IP,再进行测试. 访问 Project ...

  5. 浏览器中用JavaScript获取剪切板中的文件

    本文转自我的个人网站  , 原文地址:http://www.zoucz.com/blog/2016/01/29/get-file-from-clipboard/  ,欢迎前往交流讨论 在网页上编辑内容 ...

  6. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  7. [WPF] Wait for a moment.

    一.控件介绍 在 WPF 中使用的等待控件,控件包括三种,普通的等待信息提示(WaitTip),进度条提示(WaitProgress),以及主程序覆盖的模拟时钟等待窗口(WaitClock),具体效果 ...

  8. Hello bokeyuan!

    一个学习技术的年轻人 从2016/09/03进入大学学习计算机科学与技术这门学科,我已经学习了4个月了,大学的生活很枯燥,很麻烦,很多事,与我想象中的大学有很大的区别.但是这都不会影响我想要成为一个技 ...

  9. could not initialize proxy - no Session

    这是一个精典的问题:因为我们在hibernate里面load一个对象出来时,用到的是代理对象,也就是说当我们在执行load方法时并没有发sql语句,而是返回一个proxy对象.只有当们具体用到哪个ge ...

  10. css 填坑常用代码分享

    以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 因为提交比较麻烦,后来转置github:https://github.com/jsfront/src/blob/mast ...