我创建了一个bindings library项目来运行一个Android.aar文件。我得到的几个错误之一是:
Error CS0115 'Call.OnWarning(IDictionary)': no suitable method found to override TwilioBindings C:\...\TwilioBindings\obj\Debug\generated\src\Com.Twilio.Voice.Call.cs;
为了解决这个问题,我验证了 API.xml,发现方法 onWarning 有一个类型为 java.util.HashMap 的参数:
<method abstract="false" deprecated="not deprecated" final="false" name="onWarning" native="false" return="void" static="false" synchronized="false" visibility="public">
<parameter name="p0" type="java.util.HashMap">
</parameter>
</method>
类 Call 正在扩展 InternalCall,它实现了 RTCMonitorCommand.Listener,在我检查了 API.xml 文件后,我注意到方法 onWarning 具有以下定义:
- 内部电话 *:
<method abstract="false" deprecated="not deprecated" final="false" name="onWarning" native="false" return="void" static="false" synchronized="false" visibility="public">
<parameter name="warningDetails" type="java.util.HashMap<java.lang.String, java.lang.Object>">
</parameter>
</method>
- RTCMonitorCommand.Listener*:
<method abstract="true" deprecated="not deprecated" final="false" name="onWarning" native="false" return="void" static="false" synchronized="false" visibility="public">
<parameter name="p0" type="java.util.HashMap<java.lang.String, java.lang.Object>">
</parameter>
</method>
所以我得出的结论是,只有类 Call 具有不同的参数类型。
因此,我在 Metadata.xml 中编写了以下代码,以更改类 Call 中方法 onWarning 的参数类型:
<attr path="/api/package[@name='com.twilio.voice']/class[@name='Call']/method[@name='onWarning' and count(parameter)=1 and parameter[1][@type='java.util.HashMap']]/parameter[1]" name="type">java.util.HashMap<java.lang.String, java.lang.Object></attr>
错误消失了,但我在使用这个绑定项目时遇到了一些问题,这是 * Metadata.xml * 中的一行,我不确定这是正确的。
有谁知道我的做法是否正确?
任何帮助都是感激不尽的,
谢谢大家。
2条答案
按热度按时间2guxujil1#
当我从这个绑定库中调用一个方法的时候,我遇到了一些问题,我认为这是由一些绑定错误引起的,但是在搜索日志后,我得出的结论是,问题是库无法找到依赖项。依赖项项目被绑定项目引用,但不知何故引用不起作用。所以我改变了引用,而不是引用包,我引用了包dll,现在它正常工作。
8ftvxx2r2#
对于遇到此错误的未来用户。我有2个导致此问题的情况,并为他们修复如下:
场景一:
在通过metadata.xml实现接口成员以修复错误 "[className] does not implement interface member [memberName]" 后收到 “no suitable method found to override”。我的[className]是
DefaultTimerBar
,我的接口成员名称是ITimeBar.SetEnabled(bool)
。我怀疑当接口成员命名为“getX()”或“setX()”时,编译器会将其视为get/set属性。在上面的
setEnabled(bool)
的情况下,当方法名称属性为小写时,该方法将被实现为override
。随后产生错误:* 没有找到合适的方法来覆盖 *。当更改为大写时,它将正确地实现为virtual
。我的推理是由于当方法名称不在.aar文件中以get/set开始时,不会发生相同的行为。场景二:
错误 *[className].[methodName]:没有找到合适的方法来覆盖 * received,而没有为特定方法进行先前的元数据转换。我的方法名为
SetFullScreen(bool)
,所以我假设这是由于编译器错误地将其视为getter/setter的相同问题。我的解决方案是删除该方法,然后重新添加方法,名称的前导字母大写。我只是从api中复制了方法的详细信息。绑定项目目录obj\Debug\api.xml
中的xml文件。