解決Xamarin.Android繫結第三方庫時型別丟失的問題
現象
今天在做一個第三方庫繫結時,遇到如下情況:
摘取其中一段程式碼如下:
/Users/huangboru/myfile/xamarin_workspace/version4/CrashEyeTestPlus/obj/Debug/generated/src/Com.Xsj.Crasheye.ActionError.cs(88,88): Error CS0234: The type or namespace name 'IInterfaceDataType' does not exist in the namespace 'Com.Xsj.Crasheye' (are you missing an assembly reference?) (CS0234) (CrashEyeTestPlus)
錯誤程式碼的意思是無法找到IInterfaceDataType型別。
解決過程
為了方便檢視繫結的情況,我新建了一個Android Studio專案,新增這個第三方庫,去看這個型別是什麼,看到的情況如下:
package com.xsj.crasheye;import android.content.Context;interface InterfaceDataType { String toJsonLine(); void send(Context var1, NetSender var2, boolean var3); void send(NetSender var1, boolean var2); void save(BaseDataSaver var1); }
查閱,發現此類問題的可能情況有:
透過分析,我認為這個問題是第4種情況:Java允許一個公開型別去繼承一個非公開的型別,而這在.Net中是不受支援的。由於繫結生成器無法生成對非公開型別的繫結,自然也就無法準確地繫結其公開的子類。為了解決這個問題,我們需要在Metadata.xml檔案中將這個非公開的型別宣告為公開型別。
在我的專案中,我新增的程式碼如下:
<attr path="/api/package[@name='com.xsj.crasheye']/interface[@name='InterfaceDataType']" name="visibility">public</attr> <attr path="/api/package[@name='com.xsj.crasheye']/interface[@name='InterfaceExecutor']" name="visibility">public</attr>
不過問題並沒有完全消除,還有一個error:
/Users/huangboru/myfile/xamarin_workspace/version4/CrashEyeTestPlus/obj/Debug/generated/src/Com.Xsj.Crasheye.ActionTransactionStop.cs(38,38): Error CS0234: The type or namespace name 'EnumTransactionStatus' does not exist in the namespace 'Com.Xsj.Crasheye' (are you missing an assembly reference?) (CS0234) (CrashEyeTestPlus)
我跟進到出現問題的地方:
// Metadata.xml XPath field reference: path="/api/package[@name='com.xsj.crasheye']/class[@name='ActionTransactionStop']/field[@name='status']" [Register ("status")] protected global::Com.Xsj.Crasheye.EnumTransactionStatus Status { get { const string __id = "status.Lcom/xsj/crasheye/EnumTransactionStatus;"; var __v = _members.InstanceFields.GetObjectValue (__id, this); return global::Java.Lang.Object.GetObject<global::Com.Xsj.Crasheye.EnumTransactionStatus> (__v.Handle, JniHandleOwnership.TransferLocalRef); } set { const string __id = "status.Lcom/xsj/crasheye/EnumTransactionStatus;"; IntPtr native_value = global::Android.Runtime.JNIEnv.ToLocalJniHandle (value); try { _members.InstanceFields.SetValue (__id, this, new JniObjectReference (native_value)); } finally { global::Android.Runtime.JNIEnv.DeleteLocalRef (native_value); } } }
對方是一個非公開enum型別,我嘗試像上面一樣公開這個enum,但不可行。
觀察程式碼可知,Xamarin在嘗試繫結一個ActionTransactionStop的status欄位,我到原生專案中檢視這個欄位:
public class ActionTransactionStop extends ActionTransaction implements InterfaceDataType { protected EnumTransactionStatus status; ....... }
可知這是一個protected的欄位,我們應該用不著也不應該訪問這個欄位,於是我直接新增了移除這個欄位繫結的程式碼如下:
<remove-node path="/api/package[@name='com.xsj.crasheye']/class[@name='ActionTransactionStop']/field[@name='status']" />
reBuild,ok!
作者:臨歲之寒
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4422/viewspace-2820963/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- RocketMq訊息丟失問題解決MQ
- SpringCloud解決feign呼叫token丟失問題SpringGCCloud
- JavaScript中解決計算精度丟失的問題JavaScript
- 資料庫高可靠,輕鬆解決事務丟失問題資料庫
- Redis SortedSet結構score欄位丟失精度問題解決辦法Redis
- Jison解決JS處理後端返回的Long型資料精度丟失問題JS後端
- 資料庫連結時的時區問題serverTimezone永久解決資料庫Server
- Django資料庫連線丟失問題Django資料庫
- Nginx session丟失問題處理解決方法NginxSession
- 前後端分離解決session跨域丟失問題後端Session跨域
- 解決RabbitMQ訊息丟失與重複消費問題MQ
- 使用 requests 2.11 版本時的 Site ID 型別問題及解決方案型別
- Js深度拷貝解決雙向繫結問題JS
- Vuex資料頁面重新整理丟失問題解決方案Vue
- Spring Mvc Long型別精度丟失SpringMVC型別
- JS大坑之19位數的Number型精度丟失問題JS
- 【Socket】解決UDP丟包問題UDP
- 【NX/UG】解決:使用重用庫的零件,下次開啟發現零件丟失問題
- 解決 php 使用json_encode存入資料庫中的中文亂碼丟失反斜槓問題PHPJSON資料庫
- 記錄--前端金額運算精度丟失問題及解決方案前端
- Golang浮點數精度丟失問題擴充套件包解決方案Golang套件
- netcore釋出時 swagger xml釋出丟失問題NetCoreSwaggerXML
- PDF轉圖片部分公式字元丟失問題解決的爬坑記錄公式字元
- 請問 django admin 介面 css 丟失解決辦法?DjangoCSS
- Feign 呼叫丟失Header的解決方案Header
- 動態生成html元素繫結事件iphone失效問題解決HTML事件iPhone
- 用conda安裝庫時遇到環境查詢失敗問題解決方案
- C#-INotifyPropertyChanged(解決資料繫結的介面重新整理問題)C#
- webpack-dev-server 代理解決cookie丟失問題--cookiePathRewriteWebdevServerCookie
- thinkphp5丟失日誌問題,該如何解決?PHP
- git server“丟失”commit問題探究GitServerMIT
- js浮點數丟失問題JS
- 解決 Ubuntu 在啟動時凍結的問題Ubuntu
- yii2 從資料庫獲取內容值型別與資料庫欄位型別問題解決資料庫型別
- git clone失敗問題解決Git
- 完美解決方案-雪花演算法ID到前端之後精度丟失問題演算法前端
- git合併丟失程式碼問題分析與解決(錯誤操作導致)Git
- vue 打包上線後 css3漸變屬性丟失的問題解決方案VueCSSS3