使用Xamarin開發Android APP時,

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

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

這裡用Eclipse和VS2010來作範例。

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

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

將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檔。

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

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

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

開啟後的目錄結構

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

選擇jar檔

加入完成

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

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

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

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

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

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

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

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

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

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

開啟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>

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

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

接著就是測試拉~

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

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

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

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

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

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();  };

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

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

也確定他有實作IDictionary

照著原本要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 };

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

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

例如Android.Graphics.Color。

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

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

[Xamarin.Android]使用Java Bindings Libary專案 Binding Java元件(.jar) 與Metadata.xml、型別對應 (转帖)的更多相关文章

  1. [Xamarin.Android]如何引用JAR檔案 (转帖)

    這個範例是如何在Xamarin.Android中去使用一個我們自行在開發的JAR檔案. 主要會執行的步驟如下 1. 在Xamarin建立一個Android Java Bindings Library ...

  2. 【Xamarin挖墙脚系列:Xamarin.Android的API设计准则】

    原文:[Xamarin挖墙脚系列:Xamarin.Android的API设计准则] 前言 楼主也是看着Xamarin的官方文档来的.基本也是照猫画虎.英语勉强凑合.翻译的不对的地方,大家多多指教.(这 ...

  3. 我正在使用Xamarin的跨平台框架—Xamarin.Android回忆录

    一.缘起 在自己给别家公司做兼职外包的时候,已经明确知道外包的活不是那么好干的,一般在经历了初期热血澎湃的激情后,逐渐冷淡,愤怒,再冷淡,再愤怒…,听上去好像高潮迭起,但令人尴尬的是,这高潮迭起我们都 ...

  4. Xamarin Android提示内存溢出错误

    Xamarin Android提示内存溢出错误 错误信息:java.lang.OutOfMemoryError, Consider increasing the value of $(JavaMaxi ...

  5. [Xamarin] 產生專案的AndroidManifest.xml (转帖)

    紀錄一下 Xamarin 如何開啟 AndroidManifest.xml,因為這跟權限有關係,每個Android App幾乎都要設定 每次都想Add File 去增加但是其實是不對的 工具上面不管是 ...

  6. Xamarin.Android 入门之:Bind java的jar文件+Android显示gif图片

    一.引言 在xamarin开发的时候,有时我们想要做一个功能,但是这个功能已经有人用java写好了,并且打包成了jar文件.那么我们可以直接把对方的jar文件拿过来用而不是重新用c#写代码. 关于bi ...

  7. xamarin android如何将Java.Lang.Object类型转成C#类型

    问题起源 其实这个标题也可以换一个更准确一点,因为我遇到的问题是: xamarin android中的Class继承了Java.Lang.Object ,将json序列化成c#类型时发现无法赋值,序列 ...

  8. [Xamarin.Android] 如何使用Google Map V2 (转帖)

    Google Map v1已經在2013年的3月開始停止支援了,目前若要在你的Android手機上使用到Google Map,就必須要使用 到Google Map v2的版本.在Xamarin要使用G ...

  9. [Xamarin.Android]使用SqliteNET (转帖)

    Xamarin除了提供ADO.NET方式操作Sqlite外, 也提供了一個類似Entity Framework的SqliteNET, 可至官網提供的連結下載Source, 或點選這裡下載. 以下範例使 ...

随机推荐

  1. nginx 集群介绍

    nginx 集群介绍 完成一次请求的步骤 1)用户发起请求 2)服务器接受请求 3)服务器处理请求(压力最大) 4)服务器响应请求 缺点:单点故障 单台服务器资源有限 单台服务器处理耗时长 ·1)部署 ...

  2. Linux的磁盘分区(三)

    RAID 廉价冗余磁盘阵列 Redundant Arrays of Inexpensive Disks 不同级别的RAID功能.特性各不相同 对比项 RAID0 RAID1 RAID10 RAID5 ...

  3. python 3安装PDFMiner3K

    首先确保,你的pyhton是python 3 可在https://www.python.org/downloads/处下载 打开cmd,键入pip3 install pdfminer3k

  4. Grails入门系列(一)

    Grails入门系列(一) JAVAweb开发技术相对于php,python,note.js等新式技术更为复杂,向来以繁杂的配置著称,但是Java任然被广泛的应用于大型企业级的项目,主要是因为技术成熟 ...

  5. OpengGL中图形绘制先后问题

    OpengGL中图形绘制先后问题 在opengl中,场景绘制总有个先后的顺序,也有个程序先后的问题,图形程序在前在后,对最终的图形的影响如何? (1)设置图中的点(蓝色)与线条(浅蓝)z分量都是0,如 ...

  6. css transition & animation

    transition 支持:IE10+ img{ transition: 1s 1s height ease; } transition-property: 属性transition-duration ...

  7. expect+scp传输文件发现文件丢失

    背景 使用expect+scp去跨机器传输文件,(别问我为什么,因为公司的测试机器都是通过堡垒机的,无法绕开堡垒机,只能暂时使用这个方法了),结果发现从A传递到B的tar.gz文件大小不一致了的,当时 ...

  8. gitignore 使用

    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规则例如: # 此为注 ...

  9. 推荐两款国人开发的html前段框架

    1.http://www.h-ui.net/  H-ui前端框架官方网站 2.http://www.builive.com/  BUI是基于JQuery的富客户端UI框架

  10. BASE64编码乱码问题的浅层分析与解释

    本文由作者朱臻授权网易云社区发布. 1问题案例 曾在开发过程中,我们遇到了BASE64编码乱码的问题,该问题的场景如下: 当web前端,将带有中文字符的字符串base64编码后,传到后端.当后端将数据 ...