xamarin调用java_[Xamarin.Android]使用Java Bindings Libary專案 Binding Java元件(.jar) 與Metadata.xml、型別對應 (转帖)...

使用Xamarin開發Android APP時,

如果已經有原本就用Java寫好的套件(.jar),

就可以利用Xamarin提供的Java Bindings Libary將他變成C#可使用的元件。

這裡用Eclipse和VS2010來作範例。

首先用Eclipse開啟一個新Java專案,套件名稱就取名叫xamarin.testbinding。

並建立兩個類別分別為Test、TestBinding。

image_thumb.png

將Test做成一個抽象類別,並給定一個未實作的方法testProtected(),存取修飾給protected。

稍後會提為什麼要這樣做~

1

packagexamarin.testbinding;

2

3

publicabstractclassTest {

4

5

protectedabstractString testProtected();

6

}

接著開始寫TestBinding這個Class,記得要讓他繼承剛剛寫好的Test抽象類別。

這裡刻意將實作出的testProtected這個方法的存取修飾改成public。在Java中這樣是可以編譯過的~

01

packagexamarin.testbinding;

02

importjava.util.HashMap;

03

publicfinalclassTestBindingextendsTest {

04

05

publicString Test(){

06

return"Binding Test";

07

}

08

09

publicintTestHashMap(HashMap map){

10

returnmap.get("V1")+map.get("V2");

11

}

12

13

@Override

14

publicString testProtected() {

15

// TODO 自動產生的方法 Stub

16

return"Test  Visibility";

17

}

18

}

利用Eclipse的匯出功能可以很快的做出jar檔。

image_thumb_1.png

image_thumb_3.png

image_thumb_4.png

到這裡jar已經成功的做出來了。

接著就是要如何用java binding讓C#也能呼叫這個元件。

開啟VS2010,選擇Java Bindings Libary專案範本。

image_thumb_5.png

開啟後的目錄結構

image_thumb_6.png

將我們做出的jar檔加入至Jars資料夾內。

image_thumb_7.png

選擇jar檔

image_thumb_8.png

加入完成

image_thumb_9.png

然後將jar檔的屬性中的建置動作改成EmbeddedJar

image_thumb_10.png

到這就可以建置專案了,通常沒有問題的情況下是可以直接建置成功的,

但是剛剛做的Java程式中,有一個東西是不符合 C#規則的

image_thumb_11.png

沒錯,就是剛剛的存取修飾,在C#中是不能變更繼承方法的存取修飾的,否則就會出現這樣的錯誤。

點開錯誤找到錯誤的地方。

就可以發現他自動產生出抽象類別中的TestProtected存取修飾是protected

image_thumb_12.png

image_thumb_13.png

image_thumb_14.png

該class檔是自動產生出來的,所以直接去改他也沒有意義,

利用修改Transforms資料夾中的Metadata.xml來指定在自動產生檔案時,

可把該方法的存取修飾改成protected。

先點選剛剛點擊錯誤跳出來的地方,上面就有寫著把該方法加進Metadata的資訊,只要Path開始後那段。

image_thumb_15.png

開啟Metadata.xml,在metadata tag內增加一個attr tag 並把剛剛複製的那段當作tag的屬性加進去,

再給一個屬性為name,值為visibility。tag內的值就給protected,並重新建置。

這樣在建置時他就會自動把該方法改為protected。

(如還會失敗的話可以試著把自動產出的class視窗關閉,並用清除重建的方式建置)

1

protected

重建成功後,可以看專案目錄下的obj\Debug\generated\src\Xamarin.Testbinding.TestBinding.cs

這就是自動產生出來的cs檔。看到剛剛錯誤的地方已經被改成protected了。

image_thumb_16.png

image_thumb_17.png

接著就是測試拉~

加入一個Android View專案來測試程式。

image_thumb_18.png

在View中參考剛剛完成的binding專案。

image_thumb_20.png

image_thumb_19.png

點一下剛剛參考的專案,已經可以看到Java中做出來的類別了。

可以發現看不到testProtected這個方法,因為修飾詞為protected必須要繼承後才可存取。

image_thumb_21.png

image_thumb_22.png

開啟View中預設的Layout,原本的就不理了~新增兩個按鈕。

image_thumb_24.png

Test按鈕就呼叫Java中的Test方法。並執行看結果。很成功的取得Java Test方法中回傳的字串。

1

Xamarin.Testbinding.TestBinding test =newXamarin.Testbinding.TestBinding();

2

FindViewById(Resource.Id.btnTest).Click += (sender, e) => { Toast.MakeText(this, test.Test(), ToastLength.Short).Show();  };

image_thumb_25.png

至於另外一個方法…嗯 這是要我傳啥鬼進去才行

image_thumb_26.png

對TestHashMap點擊右鍵移至定義就可以看到自動產生出的程式碼。其中這一行就是我們要傳入的型別,JavaDictionary

也確定他有實作IDictionary

image_thumb_28.png

image_thumb_29.png

image_thumb_30.png

照著原本要V1和V2的Key給值。

測試成功~

1

FindViewById(Resource.Id.btnTestHashMap).Click += (sender, e) =>

2

{

3

JavaDictionary dic =newJavaDictionary();

4

dic.Add("V1", 100);

5

dic.Add("V2", 300);

6

Toast.MakeText(this, test.TestHashMap(dic).ToString(), ToastLength.Short).Show();

7

};

image_thumb_31.png

binding專案中還有其他許多可以設定的東西,像是當傳入參數是列舉值時,

自動產生出來的Class參數會變成int類型,必須要明確的去指定他的型別才會轉成Xamarin中對應的列舉值。

例如Android.Graphics.Color。

可以看看官網的教學也有滿詳細的範例喔。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值