草庐IT

android - Xamarin.Android 绑定(bind)使用 EnumMethods.xml 定义 Getter/Setter 方法作为接口(interface)

coder 2023-12-15 原文

EnumMethods.xml 有问题。我将它用于某些界面,并且 this映射按预期工作。但是,如果我有另一个扩展原始接口(interface)的接口(interface),则映射不起作用,我会收到以下错误:

“无法将类型‘int’隐式转换为‘MyEnum’。存在显式转换(是否缺少强制转换?)”

“无法将类型‘MyEnum’隐式转换为‘int’。存在显式转换(是否缺少强制转换?)”

有什么建议吗?

映射如下所示:

<mapping jni-interface="path/IView">
  <method jni-name="getSmth" parameter="return" clr-enum-type="MyEnum" />
  <method jni-name="setSmth" parameter="param" clr-enum-type="MyEnum" />
</mapping>

编辑

澄清一下。假设第二个称为 IViewInheritor。所以上面的错误都在 IViewInheritorInvoker 类里面。 我也有这个类的映射。

<mapping jni-interface="path/IViewInheritor">
  <method jni-name="getSmth" parameter="return" clr-enum-type="MyEnum" />
  <method jni-name="setSmth" parameter="param" clr-enum-type="MyEnum" />
</mapping>

attached bindings project

最佳答案

首先,让我们看一下 Core.IViewapi.xml 定义:

<interface abstract="true" deprecated="not deprecated" final="false" name="IView" static="false" visibility="public">
<method abstract="true" deprecated="not deprecated" final="false" name="getVisibility" native="false" return="int" static="false" synchronized="false" visibility="public">
</method>
<method abstract="true" deprecated="not deprecated" final="false" name="setVisibility" native="false" return="void" static="false" synchronized="false" visibility="public">
<parameter name="p0" type="int">
</parameter>
</method>
</interface>

很好,我们看到了确切的参数名称和返回类型。

1>BINDINGSGENERATOR : warning : [Interface] dom.core.IView in [Method] void setVisibility(int p0) has 'unnamed' parameters

1>BINDINGSGENERATOR : warning BG8A04: <attr path="/api/package[@name='dom.core']/interface[@name='IView']/method[@name='setVisibility']/parameter[@name='visibility']"/> matched no nodes.

所以我们需要在Core项目的EnumMethods.xml中将这里的参数重命名为p0

然后我们就可以看出区别了:

IView:

static Delegate cb_getVisibility;
#pragma warning disable 0169
        static Delegate GetGetVisibilityHandler ()
        {
            if (cb_getVisibility == null)
                cb_getVisibility = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_GetVisibility);
            return cb_getVisibility;
        }

        static int n_GetVisibility (IntPtr jnienv, IntPtr native__this)
        {
            global::Dom.Core.IView __this = global::Java.Lang.Object.GetObject<global::Dom.Core.IView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
            return (int) __this.Visibility;
        }
#pragma warning restore 0169

        static Delegate cb_setVisibility_I;
#pragma warning disable 0169
        static Delegate GetSetVisibility_IHandler ()
        {
            if (cb_setVisibility_I == null)
                cb_setVisibility_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_SetVisibility_I);
            return cb_setVisibility_I;
        }

        static void n_SetVisibility_I (IntPtr jnienv, IntPtr native__this, int native_p0)
        {
            global::Dom.Core.IView __this = global::Java.Lang.Object.GetObject<global::Dom.Core.IView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
            global::Android.Views.ViewStates p0 = (global::Android.Views.ViewStates) native_p0;
            __this.Visibility = p0;
        }
#pragma warning restore 0169

        IntPtr id_getVisibility;
        IntPtr id_setVisibility_I;
        public unsafe global::Android.Views.ViewStates Visibility {
            get {
                if (id_getVisibility == IntPtr.Zero)
                    id_getVisibility = JNIEnv.GetMethodID (class_ref, "getVisibility", "()I");
                return (global::Android.Views.ViewStates) JNIEnv.CallIntMethod (((global::Java.Lang.Object) this).Handle, id_getVisibility);
            }
            set {
                if (id_setVisibility_I == IntPtr.Zero)
                    id_setVisibility_I = JNIEnv.GetMethodID (class_ref, "setVisibility", "(I)V");
                JValue* __args = stackalloc JValue [1];
                __args [0] = new JValue ((int) value);
                JNIEnv.CallVoidMethod (((global::Java.Lang.Object) this).Handle, id_setVisibility_I, __args);
            }
        }

ICustomView:

static Delegate cb_getVisibility;
#pragma warning disable 0169
        static Delegate GetGetVisibilityHandler ()
        {
            if (cb_getVisibility == null)
                cb_getVisibility = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_GetVisibility);
            return cb_getVisibility;
        }

        static int n_GetVisibility (IntPtr jnienv, IntPtr native__this)
        {
            global::Dom.Common.ICustomView __this = global::Java.Lang.Object.GetObject<global::Dom.Common.ICustomView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
            return __this.Visibility;
        }
#pragma warning restore 0169

        static Delegate cb_setVisibility_I;
#pragma warning disable 0169
        static Delegate GetSetVisibility_IHandler ()
        {
            if (cb_setVisibility_I == null)
                cb_setVisibility_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_SetVisibility_I);
            return cb_setVisibility_I;
        }

        static void n_SetVisibility_I (IntPtr jnienv, IntPtr native__this, int native_value)
        {
            global::Dom.Common.ICustomView __this = global::Java.Lang.Object.GetObject<global::Dom.Common.ICustomView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
            global::Android.Views.ViewStates value = (global::Android.Views.ViewStates) native_value;
            __this.Visibility = value;
        }
#pragma warning restore 0169

        IntPtr id_getVisibility;
        IntPtr id_setVisibility_I;
        public unsafe global::Android.Views.ViewStates Visibility {
            get {
                if (id_getVisibility == IntPtr.Zero)
                    id_getVisibility = JNIEnv.GetMethodID (class_ref, "getVisibility", "()I");
                return JNIEnv.CallIntMethod (((global::Java.Lang.Object) this).Handle, id_getVisibility);
            }
            set {
                if (id_setVisibility_I == IntPtr.Zero)
                    id_setVisibility_I = JNIEnv.GetMethodID (class_ref, "setVisibility", "(I)V");
                JValue* __args = stackalloc JValue [1];
                __args [0] = new JValue ((int) value);
                JNIEnv.CallVoidMethod (((global::Java.Lang.Object) this).Handle, id_setVisibility_I, __args);
            }
        }

我们看到在 ICustomView 中有几个缺失的转换:

(global::Android.Views.ViewStates) and (int)

具体在n_SetVisibility_In_GetVisibility方法中恭敬。

关于android - Xamarin.Android 绑定(bind)使用 EnumMethods.xml 定义 Getter/Setter 方法作为接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407874/

有关android - Xamarin.Android 绑定(bind)使用 EnumMethods.xml 定义 Getter/Setter 方法作为接口(interface)的更多相关文章

  1. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  2. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  3. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby - ruby 中绑定(bind)对象的实际使用 - 2

    昨晚,我在思考我认为是高级ruby​​语言的功能,即Continuations(callcc)和Bindingobjects。我的意思是高级,因为我有静态类型的oo语言背景(C#、Java、C++),我最近才发现ruby​​,所以这些语言特性对我来说不是很熟悉。我想知道这些语言功能在现实世界中的用途是什么。根据我的经验,一切都可以用静态类型的oo语言来完成,但有时我不太同意。我想我在阅读SamRuby的那篇好文章时发现了Continuation的美妙之处/兴趣:http://www.intertwingly.net/blog/2005/04/13/Continuations-for-C

  6. ruby - Spec RSpec 模型属性 setter - 2

    我正在使用Sinatra(1.2)和RSpec(2.5),并希望创建一个具有属性TDD样式的新对象。最终结果应该是这样的:classUserdefinitialize(name)@name=nameendend我知道我必须在实现之前编写示例,但我想在这里解释我的问题。:)这是我目前无法使用的规范:describeUserit"createsanewuserobject"doname=mock("Aname")user=mock(User)#shouldn'tdothis,seethereply'suser.should_receive(:name=).with(name)User.ne

  7. ruby-on-rails - Rails 4.1 和 4.2 之间 ActiveRecord Setter 的区别? - 2

    我们将我们的应用程序从Rails4.1.14升级到4.2.5.1并遇到了以下问题:string="SomeString"ar_model=SomeArModel.newar_model.some_attribute=string#nextlineistruefor4.1,butfailsfor4.2ar_model.some_attribute.object_id==string.object_id显然,对象setter会复制每个对象(如果我有一个数组,里面的每个对象也会被复制),我想知道,这是不是有意为之并且是某些新安全功能的一部分?更新我将ruby​​-2.2.2p95用于两个ra

  8. ruby - svn ruby​​ 绑定(bind)是否作为 gem 提供? - 2

    我看到有几十个与svn相关的gem,但是我在其中任何一个上找到的少量文档表明它们是命令行包装器和杂项帮助程序。(svn命令、svn钩子(Hook)等)我在野外看到过执行以下操作的代码:require'svn/core'和SVN.Repos.add(...),但该模块的作者通过apt-get提取了他的svnruby​​工具。这对我来说不是一个选择,因为我正在开发一个windows/osx工具。Thispage列出了一些项目,但特别是,我需要一些可以访问svn+ssh存储库的东西,而且我没有时间花一半的时间来挖掘文档-十几个项目,试图引导每一个。我在寻找哪个gem?从那里开始,我很乐意挖掘

  9. ruby-on-rails - 如何将 rvm 与 eclipse 的设置绑定(bind) - 2

    我正在为不同的应用程序使用多个ruby​​实例和gemset进行开发。为了在我的ruby​​版本和gemset之间切换,我使用.rvmrc文件。我还使用带有radrails插件的Eclipse作为我的开发工具。有什么方法可以让eclipse使用rvm在不同的gemsets和ruby​​版本之间自动切换? 最佳答案 Gointoyourprojectdirectoryandcreateafilecalled.rvmrccontainingtheline:rvmuseruby-1.8.7-p330@testing--default(or

  10. ruby-on-rails - Rails Controller 操作是否隐式定义事务绑定(bind)? - 2

    给定以下代码:defcreate@something=Something.new(params[:something])thing=@something.thing#anothermodel#modificationofattributesonboth'something'and'thing'omitted#doIneedtowrapitinsideatransactionblock?@something.savething.saveendcreate方法是隐式包装在ActiveRecord事务中,还是需要将其包装到事务block中?如果我确实需要包装它,这是最好的方法吗?

随机推荐