跟我做?個?德地圖的 iOS / Android MAUI控件(Android 原?庫綁定)

我們已經介紹了如何通過 .NET 綁定 iOS 原?庫 ,本篇開始介紹?下如何通過 .NET 綁定 Android 原?庫。

Android的庫

Android 的庫以 .jar 做打包, 通過?具你可以將多個 .jar 完成綁定,然后通過 C# 調?原?的 Java 庫。對?起 iOS , Android 的庫綁定簡單很多。

60e4475cb179e7e053756c2453e8a8ae.png

從上圖可以看到 Xamarin.Android / .NET for Android 通過使?托管可調?包裝器 (MCW) 實現綁定。MCW 是?個 JNI 橋,在托管代碼需要調? Java 代碼時會使?它。托管可調?包裝器還?持對 Java 類型進??類化以及覆蓋 Java 類型的虛擬?法。同樣,每當 Android 運?時 (ART) 代碼需要調?托管代碼時,它都會通過另?個稱為 Android 可調?包裝器 (ACW) 的 JNI 橋來實現。

創建?個 Android 原?庫綁定項?

通過命令?創建?個 Android 原?庫綁定項?

dotnet new android-bindinglib -o Droid.AMap

進?該項?我們看看?件結構

c9a203b6a1dd0651acade0d45b521e50.png

項???有 Transforms ?件夾有對應的三個 xml ?件,分別是 EnumFields.xml ,EnumMethods.xml , Metadata.xml , 各?作?如下 :

MetaData.xml?– 允許對最終 API 進?更改,例如更改?成的綁定的命名空間。

EnumFields.xml?– 包含 Java int 常量與 C# enums 之間的映射。

EnumMethods.xml?– 允許將?法參數和返回類型從 Java int 常量更改為 C# enums

其中 MetaData.xml ?件是這些?件中的最常?的導?,因為它允許對綁定進??般?途的更改,例如:

重命名命名空間、類、?法或字段,使其遵循 .NET 約定。

刪除不需要的命名空間、類、?法或字段。

將類移到不同的命名空間。

添加其他?持類以使綁定的設計遵循 .NET 框架模式。

01

把 jar ?件添加到綁定項?

在項?在項?中添加 Jars ?錄 ,把?德地圖的 jar 包添加到該?錄下 ,并把 arm64-v8a ,armeabi-v7a ,x86_64 ,這三個?錄添加進來:

2dcf74443f1a2c24776104651c7ffe38.png

添加完成后,修改 .csproj ?件

<Project?Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net6.0-android</TargetFramework><SupportedOSPlatformVersion>21</SupportedOSPlatformVersion><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings></PropertyGroup><ItemGroup><EmbeddedNativeLibrary Include="Jars\arm64-v8a\libAMapSDK_MAP_v9_3_0.so" /><EmbeddedNativeLibrary Include="Jars\armeabi-v7a\libAMapSDK_MAP_v9_3_0.so" /><EmbeddedNativeLibrary Include="Jars\x86_64\libAMapSDK_MAP_v9_3_0.so" /> </ItemGroup><ItemGroup><TransformFile Include="Transforms\Metadata.xml" /><TransformFile Include="Transforms\EnumFields.xml" /><TransformFile Include="Transforms\EnumMethods.xml" /></ItemGroup><ItemGroup><EmbeddedJar Include="Jars\AMap3DMap_9.3.0_AMapSearch_9.2.0_AMapLocation_6.1.0_20220608.jar" /></ItemGroup>
</Project>

這樣就把項?添加好了,沒有像 iOS 原?庫綁定那么繁瑣。然后編譯?下 ,凡爾賽 + 星??海了。

395494e2b9616fba596df367aceddcba.png

02

排雷工作

看?這么多錯,真的要考慮?下是不是放棄,其實這也?常治愈,我們逐個來排雷。

*'PoiCreator' does not implement interface member?'IParcelableCreator.NewArray(int)'.

'PoiCreator.NewArray(int)' cannot implement?'IParcelableCreator.NewArray(int)'

錯誤對應的是這個?法 ,實際就是返回類型出錯了,我們先根據源?件看看 path 路徑就可以解決

// Metadata.xml XPath method reference: path="/api/package[@name='com.amap.api.maps.model']/class[@name='PoiCreator']/method[@name='newArray' and count(parameter)=1 and parameter[1][@type='int']]"
[Register ("newArray", "(I)[Lcom/amap/api/maps/model/Poi;", "GetNewArray_IHandler")]
public virtual unsafe global::Com.Amap.Api.Maps.Model.Poi[]? NewArray (int p0)
{const string __id = "newArray.(I)[Lcom/amap/api/maps/model/Poi;";try {JniArgumentValue* __args = stackalloc JniArgumentValue [1];__args [0] = new JniArgumentValue (p0);var __rm = _members.InstanceMethods.InvokeVirtualObjectMethod (__id, this, __args);return (global::Com.Amap.Api.Maps.Model.Poi[]?) JNIEnv.GetArray (__rm.Handle, JniHandleOwnership.TransferLocalRef, typeof (global::Com.Amap.Api.Maps.Model.Poi));} finally {}}

確認好后,需要在 Metadata.xml 做添加

<attr?path="/api/package[@name='com.amap.api.maps.model']/class[@name='PoiCreator']/method[@name='newArray'?and?count(parameter)=1?and?parameter[1][@type='int']]"?name="managedReturn">Java.Lang.Object[]</attr>

*The type 'AMap' already contains a definition for 'MarkerDragEnd'

這個是重復定義導致的,只需要添加如下代碼刪除就可以了,如

<remove-node?path="/api/package[@name='com.amap.api.maps']/interface[@name='AMap.OnCameraChangeListener']"?/>

*'BusLineSearch': member names cannot be the same as their enclosing type

重命名導致的錯誤 ,把名字修改?下即可,如

<attr?path="/api/package[@name='com.amap.api.services.busline']/class[@name='BusLineSearch']"?name="managedName">AmapBusLineSearch</attr>

*cannot change access modifiers when overriding 'protected'

重載的時候出現權限問題,這個時候你需要的是把權限修正好,如

<attr?path="/api/package[@name='com.amap.api.maps.model']/class[@name='PolygonOptions']/method[@name='getUpdateFlags'?and?count(parameter)=0]"name="visibility">protected</attr>

解決上述的所有問題,基本上就可以治愈了,當編譯通過?刻你會?常興奮

54918823709b6c39853ee7a7962955ae.png

找個 .NET for Android 項?看看

86bc7100cb78aec6f37827dd6192dd0e.jpeg

?家可以去我的 GitHub 下載該示例

https://github.com/kinfey/AMapMAUIControls/tree/main/samples/Droid.Bindings

小結

Android 的原?綁定? iOS 的簡單得多,所以更容易??。希望各位?伙伴能多動?,有時候也是?個很好的體驗。經過兩篇?章的學習,相信?家也掌握了如何? .NET 綁定 iOS 和 Android 的原?庫了。最后?篇?章我們來討論下如何做?個適配 MAUI 的原?控件。

*相關資料

1. 通過 Microsoft Docs 了解 MAUI?

https://aka.ms/Docs.MAUI

2. 通過 Microsoft Learn 學習 MAUI?

https://aka.ms/Learn.MAUI

3.使??德地圖 SDK for Android 請訪問

https://developer.amap.com/api/android-sdk/gettingstarted

4.了解 Android 原?庫綁定的內容,請訪問 https://docs.microsoft.com/enus/xamarin/android/platform/binding-java-library/

CA周記往期回顧:

8091d09db99ebf2d1182808af407629a.jpeg

更多原創文章與資源共享

請關注Kinfey Techtalk

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284793.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284793.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【QGIS入門實戰精品教程】4.6:QGIS實現柵格(影像、DEM)的拼接與掩膜提取

參考閱讀:ArcGIS實驗教程——實驗十一:影像拼接與提取 加載實驗數據 本實驗所采用的柵格數據為兩個dem數據和一個矢量范圍數據,加載如下圖所示: 柵格數據信息如下: 柵格拼接 點擊下拉菜單【柵格】→【雜項】→【合并(merge)】,如下所示:

ReSharper 2020.2 補丁

ReSharper 是一個JetBrains公司出品的著名的代碼生成工具。其能幫助Microsoft Visual Studio成為一個更佳的IDE&#xff0c;它包括一系列豐富的能大大增加C#和Visual Basic .net開發者生產力的特征。使用ReSharper&#xff0c;你可以進行深度代碼分析&#xff0c;智能代碼協助…

【轉】【公司調查】車來了APP

http://blog.sina.com.cn/s/blog_83b10acc0102vk7k.html【APP簡介】"車來了"是武漢元光科技有限公司開發的一款查詢公交車實時位置的手機軟件。不僅能提供公交車的到站距離、預計到站時間&#xff0c;還能顯示整條線路的實時通行狀況&#xff0c;讓人們不再盲目等待&…

零中頻接收機主要問題

直流偏差和本振泄漏問題基本不會影響超外差式接收機的性能&#xff0c;問題主要是鏡頻抑制。需要高Q值的帶通濾波器。 零中頻不存在鏡頻干擾&#xff0c;可以省掉鏡像抑制濾波器和中頻濾波器。零中頻的主要問題是&#xff1a;1直流偏差 2本振泄漏 3 閃爍噪聲。 1 本振泄漏 本振…

軍哥華為HCNP(科目H12-221)真題解析課程:1-30題

華為HCNP&#xff08;科目H12-221&#xff09;真題解析HCNP-R&S-IERS&#xff1a;(Huawei Certified Network Professional-Implementing Enterprise Routing and Switching Network)第1部分 如何參加HCNP考試1.1很簡單&#xff0c;華為HCNP即使沒有HCNA證書也可以考取&…

Blazor University (36)組件庫

原文鏈接&#xff1a;https://blazor-university.com/component-libraries/組件庫組件庫使我們能夠將組件和頁面以及任何支持文件&#xff08;例如 CSS 文件、JavaScript 和圖像&#xff09;打包到一個可重用的項目中。創建一個名為 ClassLibraryConsumer 的新 Blazor 解決方案…

【QGIS入門實戰精品教程】9.1:QGIS構建泰森多邊形(Thiessen Polygon)實例精解

泰森多邊形是進行快速插值和分析地理實體影響區域的常用工具。例如,用離散點的性質描述多邊形區域的性質,用離散點的數據計算泰森多邊形區域的數據。泰森多邊形可用于定性分析、統計分析和臨近分析等。 參考教程: ArcGIS構建泰森多邊形(Thiessen Polygon)實例精解 【Glob…

“Visual Studio 啟動不能打開上次打開的文件” 最正確的解決姿勢

網上很多提供的方法&#xff0c;不是刪除.vs目錄&#xff0c;就是修改.suo文件。 刪除有風險&#xff0c;操作需謹慎&#xff01;&#xff01; 其實最簡單的方法就是&#xff1a;工具——選項——項目和解決方案——?加載解決方案時重新打開文檔(D)

【QGIS入門實戰精品教程】5.1:QGIS地理坐標轉火星坐標系(GCJ02)案例教程

本文以案例的形式,講述WGS84(GPS)、火星坐標系(GCJ02)、百度地圖(BD09)坐標系之間互相轉換。 一、WGS轉火星坐標系對比 文中將行政區的WGS坐標轉為火星坐標系,局部效果對比: 二、火星坐標系簡介 火星坐標系統是一種國家保密插件,也叫做加密插件或者加偏或者SM模組,其…

spark streaming 的 Job創建、調度、提交

2019獨角獸企業重金招聘Python工程師標準>>> 上文已經從源碼分析了Receiver接收的數據交由BlockManager管理&#xff0c;整個數據接收流都已經運轉起來了&#xff0c;那么讓我們回到分析JobScheduler的博客中。 // JobScheduler.scala line 62def start(): Unit sy…

CSS屬性總結之background

最近在學習css3的一些新屬性&#xff0c;就把一些使用中遇到的方法和問題做一個小結。 background-color 背景顏色在IE7之前只顯示到padding區域&#xff0c;不包含border。而現代瀏覽器background-color都是從border的左上角&#xff0c;到border的右下角。 background-color:…

官宣!微軟發布 VS Code Server!

北京時間 2022 年 7 月 7 日&#xff0c;微軟在 VS Code 官方博客中宣布了 Visual Studio Code Server&#xff01;遠程開發的過去與未來2019 年&#xff0c;微軟發布了 VS Code Remote&#xff0c;開啟了遠程開發的新時代&#xff01;2020 年&#xff0c;微軟發布了 GitHub Co…

iis管理常用命令 創建IIS站點 應用應用程序 及虛擬目錄

::防止中文輸出亂碼 chcp 65001::臨時設置PATH set PATH%SystemRoot%\system32\inetsrv;%PATH% ::列出所有站點 appcmd list site::站點名稱 set sitename"WisdomEducation"::綁定域名和端口號 set domain"http/*:8080:,https/*:8443:"::網站源文件物理路徑…

【QGIS入門實戰精品教程】4.4:QGIS如何將點自動連成線、線生成多邊形?

個人簡介:劉一哥,多年研究地圖學、地理信息系統、遙感、攝影測量和GPS等應用,精通ArcGIS等軟件的應用,精通多門編程語言,擅長GIS二次開發和數據庫系統開發,具有豐富的行業經驗,致力于測繪、地信、數字城市、資源、環境、生態、國土空間規劃、空間數字建模、無人機等領域…

.NET7之MiniAPI(特別篇) :Preview6 緩存和限流

前幾在用MiniAPI時還想沒有比較優雅的緩存&#xff0c;這不&#xff0c;Preivew6就帶來了。使用起來很簡單&#xff0c;注入Sevice&#xff0c;引用中間件&#xff0c;然后在Map方法的后面跟CacheOutput()就ok了&#xff0c;CacheOutpu也有不同的參數&#xff0c;可以根據每個方…

藍橋杯C1

轉一篇寫的炒雞棒的博客。講了表達式求值和詞法分析。 http://blog.csdn.net/StevenKyleLee/article/details/43099789 轉載于:https://www.cnblogs.com/wangkaipeng/p/6343204.html

曾鳴:未來十年,將確定智能商業的格局|干貨

2019獨角獸企業重金招聘Python工程師標準>>> 20年來風云變幻&#xff0c;潮起潮涌&#xff0c;我自己最深的一個感受&#xff0c;是對“勢”這個字的理解。 第一&#xff0c;敬畏。對于商業規律和對大勢的把握&#xff0c;很容易在三五年內決定一個企業的命運。 第二…

Jedis 設置key的超時時間

一分鐘之內只能發送一次短信, 若用戶刷新頁面,然后輸入原來的手機號,則繼續計時 方案:服務器端要記錄時間戳 方法名:sMSWaitingTime 功能:返回倒計時剩余時間,單位秒 Java代碼 /*** * 倒計時還剩余多長時間 * param mobile : 手機號 * return : second */…

[轉]IIS7全新管理工具AppCmd.exe的命令使用

IIS 7 提供了一個新的命令行工具 Appcmd.exe&#xff0c;可以使用該工具來配置和查詢 Web 服務器上的對象&#xff0c;并以文本或 XML 格式返回輸出。 下面是一些可以使用 Appcmd.exe 完成的任務的示例&#xff1a; ?創建和配置站點、應用程序、應用程序池和虛擬目錄。 ?停止…

【QGIS入門實戰精品教程】4.1:QGIS柵格數據地理配準完整操作流程

推薦閱讀:ArcGIS地理配準完整操作步驟 文章目錄 一、安裝地理配準插件二、準備實驗數據三、配準操作流程1. 添加柵格數據2. 添加地面控制點3. 配準設置4. 開始配準5. 精度評價一、安裝地理配準插件 點擊下拉菜單【插件】→【管理并安裝插件】,如下圖所示: QGIS默認已經安裝…