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"后正常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM