藉助於Mono For Android技術,.Net開發者也可使用本身熟悉的C#語言以及.Net來開發Android應用。因爲Mono For Android把Android SDK中絕大部分類庫都已經實現,基本直接參考Java開發Android的書就能夠掌握Mono for android技術。html
對於有項目技術決策權的團隊,若是項目組成員對Java不熟悉,那麼可使用本身熟悉的.Net來開發Android應用,好比個人一個學生使用Mono For Android開發了一款應用(應學生要求,應用的名字保密),3月份一個月就入帳41萬元。固然是否賺錢和工具關係不大,這裏貼出這個案例只是爲了告訴你們:Mono For Android是能夠完成你的需求的java
有一個很是重要的問題,作Android開發的時候還會使用一些第三方的jar包。jar是java的技術,那麼在Mono for android中須要怎樣使用這些jar呢? 須要一個把jar綁定到dll的過程。android
下面以一個典型的Mono For android調用百度地圖sdk來說解一下這個過程:程序員
第一步:建立jar的綁定程序集數據庫
Mono for android提供了Java Binding Library用來自動化的建立綁定(或者說包裝)jar的.Net程序集,這樣就能夠經過調用程序集中的包裝類來調用jar中的類了。api
首先從百度地圖網站上下載百度地圖的SDK;緩存
接着在Visual Studio的點擊主菜單【文件】→【新建】→【項目】,在對話框中選擇Mono for Android下的「Java Binding Library」,給項目取一個名字,好比「BaiduMapSDK」;安全
接下來把baidumapapi_v2_1_1.jar放到Jars文件夾下,選中jar文件,在屬性視圖中將「生成操做」屬性設置爲「EmbeddedJar」,生成解決方案。咱們就會發如今bin/Debug文件夾下就生成了BaiduMapSDK.dll這個包裝程序集,細心的朋友應該發現了在obj\Debug\generated\src下生成的cs代碼就是對jar的封裝調用。網絡
第二步:引用綁定程序集架構
點擊主菜單【文件】→【新建】→【項目】,在對話框中選擇Mono for Android下的「Android Application」建立一個Android項目,好比取名爲「MapTest」。
在項目上點右鍵選擇【添加引用】→【項目】,在項目列表中選擇第一步建立的「BaiduMapSDK」。
若是是普通的所有都是用java代碼寫的jar,那麼這樣就能夠用了,可是百度地圖SDK中是包含使用C/C++寫的Native代碼(若是SDK包中除了jar文件以外還有.so文件,那麼就說明有一部分代碼是非Java的Native代碼)的,所以還須要把libapp_BaiduMapApplib_v2_1_1.so、libvi_voslib.so這兩個庫文件放到MapTest項目中,而且把so文件的「生成操做」設置爲「AndroidNativeLibrary」,不然運行的時候會提示加載不到Library。
在MapTest項目中建立一個libs文件夾,而且在libs文件夾下建立一個armeabi文件夾,而後把libapp_BaiduMapApplib_v2_1_1.so、libvi_voslib.so放到這個文件夾下。若是運行到armeabi-v7a CPU下,還須要一樣建立一份armeabi-v7a文件夾;一樣若是運行在x86CPU下則一樣須要建立x86文件夾(可是百度地圖SDK的so暫時不支持X86CPU)。
第三步:調用百度地圖SDK
在axml中添加地圖視圖控件:MapView
<com.baidu.mapapi.map.MapView android:id="@+id/bmapsView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
反編譯BaiduMapSDK.dll咱們會發現,這個程序集中把命名空間、類名、方法名等都改爲了.Net的命名規則,好比MapView類在java中的包名是com.baidu.mapapi.map,可是在dll程序集中命名空間變成了Com.Baidu.Mapapi.Map(首字母大寫)。
由於layout文件是給android引擎使用的,而程序集中的類只是對java類的的包裝,因此注意在layout文件中控件節點的命名空間要使用java中的命名規則com.baidu.mapapi.map.MapView,而不是Com.Baidu.Mapapi.Map.MapView。
在Activity的OnCreate中SetContentView以前添加下面的代碼來初始化百度地圖SDK,不然會報錯「com.baidu.platform.comjni.map.basemap.JNIBaseMap.Create」:
BMapManager mBMapMan = new BMapManager(this.Application);
mBMapMan.Init("個人Key", null);
注意把「個人Key」替換成從百度地圖網站上申請的應用Key。
固然尚未結束,由於還須要增長百度地圖SDK須要的權限,至少添加以下的權限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
程序運行以後百度地圖就顯示出來了。
固然若是仔細查看生成的DLL,你可能會發現全部的方法的參數名字所有都是p0、p一、p2,而不是有意義的參數名。
這是怎麼回事呢?不像.Net的MSIL中把參數名也寫入了IL代碼,Java中方法名是沒有寫入.class 的,所以工具也沒法經過jar文件分析出參數的名字,因此「Java Binding Library」生成的程序集的方法的參數名都是p0、p一、p2這樣無心義的參數名,可否命名爲有意義的參數名呢?關於這個問題能夠參考官方文檔《Binding a Java Library (.jar),Consuming Java Libraries from C#》 中「Fixing Up Parameter Names」這段內容,裏面提到了能夠編輯Metadata.xml文件來爲參數取名字。
可是這個爲參數命名的過程很枯燥,按理來講,若是咱們拿到了jar對應的java源文件,那麼Mono For Android應該能夠根據java源代碼來知道參數的名字,可是貌似這個尚未實現。我有一個思路,使用Eclipse的JDT中的Java源碼分析類ASTParser(用法參考:http://lym6520.iteye.com/blog/747840 和http://blog.csdn.net/flying881114/article/details/6187503 )來分析jar對應的java源文件,而後自動生成Metadata.xml文件。工做很忙,暫時沒時間實現這個想法,但願有園子裏的大牛能實現,造福廣大Monoer!
如鵬網.Net培訓班正在報名,有網絡的地方就能夠參加如鵬網的學習,學完就能高薪就業,點擊此處瞭解
三年前只要懂「三層架構」就能夠說「精通分層架構」;如今則須要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值錢;
三年前只要會SQLServer就能夠說本身「精通數據庫開發」;如今則需還須要掌握MySQL等開源數據庫才能說是「.Net開源」時代的程序員;
三年前只要會進行用戶上傳內容的安全性處理便可;如今則須要熟悉雲存儲、CDN等才能在雲計算時代遊刃有餘;
三年前只要掌握Lucene.Net就會說本身「熟悉站內搜索引擎開發」;如今你們都用ElasticSearch了,你還用Lucene.Net就太老土了;
三年前發郵件仍是用SmtpClient;如今作大型網站發郵件必須用雲郵件引擎;
三年前緩存就是Context.Cache;如今則是Redis、Memcached的天下;
如鵬網再次引領.Net社區技術潮流!點擊此處瞭解如鵬網.Net最新課程