Xamarin Android Bindings Java

在Xamarin中引用原生的AndroidClassLibrary的Jar檔後,遭遇編譯上的錯誤與解決…

James Tsai 2015/10/29 12:21:39
330

主題

Xamarin引用原生的AndroidClassLibraryJar後,遭遇編譯上的錯誤與解決

文章簡介

透過此篇文章的解說,你將能清楚的知道如何使用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檔到XamarinBindings Library Project當中

建置該專案後,你會看到類似以下的錯誤訊息



這時候很多人大概會以為此jar是不能用的,不過其實不是這樣而是Java跟在C#語言上有設計上有概念的不同,所以我們需要做些宣告,讓轉換的過程更加的明確所以解法很簡單,打開在專案當中的Transforms資料夾,點選metadata.xml

接著讓我們加上一些需要的宣告描述



再次重新建該專案,剛剛所出現的錯誤訊息,就會消失的無影無蹤啦~~



所以就解決了此問題,讓我們下回見….!?

我想如果就這樣結束的話,應該會被殺了吧!!!

再來我們來分析一下原因吧

該錯誤的成因與觀念討論

前面有提到Java跟在C#語言上有設計上有概念的不同,所以在轉換上會造成一些認知上的差異,而導致了這樣的binding錯誤。就讓我們來分析一下所引入的jar檔當中的問題。



打開原本所編出來的jarjava程式,我們可以看到這當中設計了一個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標籤,就是在處理這種方法回傳型態在JavaC#語言上的是否有繼承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

http://developer.xamarin.com/guides/android/advanced_topics/java_integration_overview/binding-a-java-library/troubleshooting-bindings/

Java Bindings Metadata

http://developer.xamarin.com/guides/android/advanced_topics/java_integration_overview/binding-a-java-library/java-bindings-metadata/

James Tsai