• [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

     

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

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

    1 package xamarin.testbinding;
    2  
    3 public abstract class Test {
    4  
    5     protected abstract String testProtected();
    6 }

     

     

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

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

    01 package xamarin.testbinding;
    02 import java.util.HashMap;
    03 public final class TestBinding extends Test {
    04      
    05     public String Test(){
    06         return "Binding Test";
    07     }
    08      
    09     public int TestHashMap(HashMap<String,Integer> map){
    10         return map.get("V1")+map.get("V2");
    11     }
    12  
    13     @Override
    14     public String testProtected() {
    15         // TODO 自動產生的方法 Stub
    16         return "Test  Visibility";
    17     }
    18 }

     

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

    image

    image

     

    image

     

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

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

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

    image

     

    開啟後的目錄結構

    image

     

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

    image

     

    選擇jar檔

    image

     

    加入完成

    image

     

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

    image

     

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

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

    image

     

     

     

     

     

     

     

     

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

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

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

    image 

    image

    image

     

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

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

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

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

    image

     

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

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

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

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

    1 <attr path="/api/package[@name='xamarin.testbinding']/class[@name='TestBinding']/method[@name='testProtected' and count(parameter)=0]"name="visibility">protected</attr>

     

    重建成功後,可以看專案目錄下的objDebuggeneratedsrcXamarin.Testbinding.TestBinding.cs

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

    image

    image

     

    接著就是測試拉~

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

    image

     

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

    image

    image

     

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

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

    image

    image

     

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

    image

     

     

     

     

     

     

     

     

     

     

     

     

     

     

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

    1 Xamarin.Testbinding.TestBinding test = new Xamarin.Testbinding.TestBinding();
    2           FindViewById<Button>(Resource.Id.btnTest).Click += (sender, e) => { Toast.MakeText(this, test.Test(), ToastLength.Short).Show();  };

    image

     

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

    image

     

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

    也確定他有實作IDictionary

    image 

     

     

     

     

    image

    image

     

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

    測試成功~

    1 FindViewById<Button>(Resource.Id.btnTestHashMap).Click += (sender, e) =>
    2 {
    3     JavaDictionary<string, Java.Lang.Integer> dic = new JavaDictionary<string, Java.Lang.Integer>();
    4     dic.Add("V1", 100);
    5     dic.Add("V2", 300);
    6     Toast.MakeText(this, test.TestHashMap(dic).ToString(), ToastLength.Short).Show();
    7 };

     

     

    image

     

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

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

    例如Android.Graphics.Color。

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

    http://docs.xamarin.com/guides/android/advanced_topics/java_integration_overview/binding_a_java_library_(.jar)

  • 相关阅读:
    WP7备注(13)(独立储存)
    WP7备注(14)(ContentPropertyAttribute)
    WP7备注(11)(页面跳转)
    WP7备注(10)(Accelerometer+GeoCoordinateWatcher+Map Service)
    WP7备注(12)(页面数据共享)
    WP7备注(18)(OpacityMask)
    WP7备注(15)(Resources)
    WP7备注(19)(ImageBrush|VideoBrush)
    WP7备注(17)(TextBlock和Inlines)
    vmware 复制其他电脑的linux无法上网问题
  • 原文地址:https://www.cnblogs.com/whatthehell/p/3444397.html
Copyright © 2020-2023  润新知