[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。
![]()
將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。
可以看看官網的教學也有滿詳細的範例喔。
[Xamarin.Android]使用Java Bindings Libary專案 Binding Java元件(.jar) 與Metadata.xml、型別對應 (转帖)的更多相关文章
- [Xamarin.Android]如何引用JAR檔案 (转帖)
這個範例是如何在Xamarin.Android中去使用一個我們自行在開發的JAR檔案. 主要會執行的步驟如下 1. 在Xamarin建立一個Android Java Bindings Library ...
- 【Xamarin挖墙脚系列:Xamarin.Android的API设计准则】
原文:[Xamarin挖墙脚系列:Xamarin.Android的API设计准则] 前言 楼主也是看着Xamarin的官方文档来的.基本也是照猫画虎.英语勉强凑合.翻译的不对的地方,大家多多指教.(这 ...
- 我正在使用Xamarin的跨平台框架—Xamarin.Android回忆录
一.缘起 在自己给别家公司做兼职外包的时候,已经明确知道外包的活不是那么好干的,一般在经历了初期热血澎湃的激情后,逐渐冷淡,愤怒,再冷淡,再愤怒…,听上去好像高潮迭起,但令人尴尬的是,这高潮迭起我们都 ...
- Xamarin Android提示内存溢出错误
Xamarin Android提示内存溢出错误 错误信息:java.lang.OutOfMemoryError, Consider increasing the value of $(JavaMaxi ...
- [Xamarin] 產生專案的AndroidManifest.xml (转帖)
紀錄一下 Xamarin 如何開啟 AndroidManifest.xml,因為這跟權限有關係,每個Android App幾乎都要設定 每次都想Add File 去增加但是其實是不對的 工具上面不管是 ...
- Xamarin.Android 入门之:Bind java的jar文件+Android显示gif图片
一.引言 在xamarin开发的时候,有时我们想要做一个功能,但是这个功能已经有人用java写好了,并且打包成了jar文件.那么我们可以直接把对方的jar文件拿过来用而不是重新用c#写代码. 关于bi ...
- xamarin android如何将Java.Lang.Object类型转成C#类型
问题起源 其实这个标题也可以换一个更准确一点,因为我遇到的问题是: xamarin android中的Class继承了Java.Lang.Object ,将json序列化成c#类型时发现无法赋值,序列 ...
- [Xamarin.Android] 如何使用Google Map V2 (转帖)
Google Map v1已經在2013年的3月開始停止支援了,目前若要在你的Android手機上使用到Google Map,就必須要使用 到Google Map v2的版本.在Xamarin要使用G ...
- [Xamarin.Android]使用SqliteNET (转帖)
Xamarin除了提供ADO.NET方式操作Sqlite外, 也提供了一個類似Entity Framework的SqliteNET, 可至官網提供的連結下載Source, 或點選這裡下載. 以下範例使 ...
随机推荐
- 10-09 Linux的文件系统介绍以及各种设备的说明
Linux的文件编程 linux文件管理系统分为3部分:与文件管理有关的软件,被管理的文件,实施文件管理需要的数据结构 用C语言建立,打开,关闭文件,向文件写入和读出数据等. Linux文件系统简介 ...
- (转)可以一同使用 DISTINCT 和 COUNT 关键词,来计算非重复结果的数目。
点击收看
- api接口响应类型定义
public class Response<T> { public ResponseStatus Status { get; set; } public string Message { ...
- leetcode 罗马数字转整数
罗马数字包含以下七种字符:I,V,X,L,C,D 和M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做II ,即为两个并列的 1.1 ...
- Winform窗体改变语言类型的方式
Winform改变语言类型比较复杂,需要根据不同语言应用语言资源.而软件在进行语言切换时,需要将当前的UI文化线程引用对应的语言类型.常用的有三种方式,此处使用两种,对比发现其中的优缺点: /// & ...
- 解决ie img标签内存泄漏
代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; ...
- MongoDB .Net Driver(C#驱动) - 内嵌数组/嵌入文档的操作(增加、删除、修改、查询(Linq 分页))
目录 一.前言 1. 运行环境 二.前期准备工作 1. 创建 MongoDBContext MongoDb操作上下文类 2.创建测试类 3.创建测试代码 三.内嵌数组增加元素操作 1.Update.S ...
- UWP开发入门(五)——自定义Panel
各位好,终于讲到自定义Panel了.当系统自带的几个Panel比如Gird,StackPanel,RelativePanel不能满足我们的特定要求时(其实不常见啦),自定义Panel就显得非常必要,而 ...
- linux的mount命令详解
最近在操作京东云服务器,挂在硬盘,分区等操作,重新温习了一下mount命令: linux下挂载(mount)光盘映像文档.移动硬盘.U盘.Windows和NFS网络共享. linux是个优秀的开放源码 ...
- Python装饰器(函数)
闭包 1.作用域L_E_G_B(局部.内嵌.全局...): x=10#全局 def f(): a=5 #嵌套作用域 def inner(): count = 7 #局部变量 print a retur ...