在Xamarin中引用原生的AndroidClassLibrary的Jar檔後,遭遇編譯上的錯誤與解決…
主題: |
在Xamarin中引用原生的AndroidClassLibrary的Jar檔後,遭遇編譯上的錯誤與解決… |
文章簡介: |
透過此篇文章的解說,你將能清楚的知道如何在使用Xamarin.Android時,引用原生的AndroidClassLibrary後所產生出來Jar檔後,遭遇編譯上的問題與解決的辦法。 |
作者: |
James Tsai |
版本/產出日期: |
V1.0/2015.10.28 |
1. 前言
• 常常會遇到有人在Xamarin.Android開發時,有需要將過去開發好的Android Class Library透過Binding的技巧引入到Xamarin.Android的專案來使用,但匯入後常常會發生無法正確編譯的問題,此篇文章將幾個基本常見的狀況,做一個簡單的介紹與解決辦法。
• 在昕力大學之前的Xamarin與行動開發相關的這篇“如何在Xamarin中引用原生的AndroidClassLibrary所產生出來的Jar檔”的文章中,是介紹如何將Android Class Library透過Binding的技巧引入到Xamarin.Android的專案來使用,如果不是這麼清楚知道之中道理的人,可以再點此 觀看複習一下。
2. 環境準備
• Windows 8/8.1/10
• Eclipse with ADT
• Visual Studio 2015
3. 本文
在Visual Studio當中編譯Bindings Library Project發生錯誤。
• 首先我們先在Visual Studio當中確認已經匯入jar檔到Xamarin的Bindings Library Project當中。
• 建置該專案後,你會看到類似以下的錯誤訊息。
• 這時候很多人大概會以為此jar是不能用的,不過其實不是這樣。而是Java跟在C#語言上有設計上有概念的不同,所以我們需要做些宣告,讓轉換的過程更加的明確。所以解法很簡單,打開在專案當中的Transforms資料夾,點選metadata.xml。
• 接著讓我們加上一些需要的宣告描述。
• 再次重新建該專案,剛剛所出現的錯誤訊息,就會消失的無影無蹤啦~~
所以就解決了此問題,讓我們下回見….!?
我想…如果就這樣結束的話,應該會被殺了吧!!!
再來我們來分析一下原因吧…
該錯誤的成因與觀念討論
• 前面有提到Java跟在C#語言上有設計上有概念的不同,所以在轉換上會造成一些認知上的差異,而導致了這樣的binding錯誤。就讓我們來分析一下所引入的jar檔當中的問題。
打開原本所編出來的jar的java程式,我們可以看到這當中設計了一個Interface叫做IMyClass(綠色框),然後有兩個Class一個叫做AbsMyClass(橘色框)一個叫做MyClass(藍色框)都去實作了IMyClass。
而IMyClass有設計一個方法叫做abc,所以實作該Interface的類別都需要實作該方法abc,而可是這兩個實作的Class在實作方法abc的時候,回傳值卻又不是規規矩矩的回傳當初abc所訂的回傳型態,而是回傳該型態的實作型態(or 子類別型態),在java的語言概念來說,這樣是合法的方式,可是在C#這樣就會有點問題了。
• 所以我們再回來仔細看看錯誤訊息與剛剛加在metadata.xml的描述宣告的對照吧!!!
舉Visual Studio告訴我們的第一個錯誤訊息來說,它是在告訴我們說有一個名字叫做AbsMyClass的傢伙,並沒有去實作介面IMyClass當中的成員方法Abc()。
這就是前一點所說的C#的語言認知不同。所以,我們加入的宣告attr標籤,就是在處理這種方法回傳型態在Java與C#語言上的是否有繼承or實作關係上定義不同的問題。這東西不是我這篇小作可以再繼續深入討論下去的了,如果有興趣可以自行在研究C#跟Java的繼承與實作概念。但在使用上都還是會參考到該回傳物件的,所以操作上是沒有問題的,不過若有某些語言上的信念堅持,在此個人也不便多作評論。
在attr標籤當中的path屬性應該沒什麼太大問題,其值就是將本來java當中的package的名稱打上去,而後面的class名稱就是對應的類別名稱,而method就是指定出問題的Method。後面比較特殊的就是設定name屬性,其值就須設定為managedReturn。
然後將本來Interface當中所定義的abc方法的回傳型態給宣告在attr標籤當中,在本例子裡就是IMyClass。
所以第二個錯誤訊息也是一樣的意思,依樣畫葫蘆就可以解決了。
• 而如果jar檔不是我們自己寫的怎麼辦?!根本看不到原始的java程式阿!!!嗯?你當然可以用Java Decompiler來回去看java程式的繼承關係or實作關係阿!!!
更何況我們現在可是有號稱地表上最強大的IDE開發工具耶!!!只要叫出物件瀏覽器,然後再看看該有的CodeMap,就可以輕鬆寫意的知道該繼承關係or實作關係了好嗎?!
如下圖:
各位,不要浪費自己手頭上如此強大的IDE開發工具阿~~
4. 參考來源
• Troubleshooting Bindings
• Java Bindings Metadata