我创建了一个绑定库项目,以便能够运行Android .aar文件。 我得到的几个错误之一是:
Error CS0115 'Call.OnWarning(IDictionary)': no suitable method found to override TwilioBindings C:...TwilioBindingsobjDebuggeneratedsrcCom.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 正在扩展实现RTCMonitorCommand.Listener的InternalCall,在我检查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具有不同的参数类型。
因此,我在元数据中编写了以下行.xml以更改类调用中警告的方法的参数类型:
<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>
错误消失了,但我在使用此绑定项目时遇到了一些问题,这是元数据中的行.xml我不是对的。
有谁知道我的方法是否正确?
任何帮助都值得赞赏,
谢谢。
从这个绑定库调用方法时遇到问题,我认为这是由某些绑定错误引起的,但后来,在日志中搜索后,我得出的结论是问题是库无法找到依赖项。绑定项目正在引用依赖项项目,但不知何故引用不起作用。所以我更改了引用,而不是引用包,而是引用包 dll,现在它运行正常。
对于将来遇到此错误的用户。我有 2 种情况导致我出现此问题,它们的修复方法如下:
场景 1:
通过元数据实现接口成员后收到的"找不到合适的方法来覆盖">.xml以修复错误"[类名] 未实现接口成员 [memberName]"。我的 [类名] 是DefaultTimerBar
,我的接口成员名是ITimeBar.SetEnabled(bool)
。
<!--Fixes The following metadata change will resolve "[className] does not implement interface member [memberName]",
however it will now give the error "DefaultTimeBar.SetEnabled(bool): no suitable method found to override"-->
<add-node path="/api/package[@name='com.mycompany.mypackage']/class[@name='DefaultTimeBar']">
<method name="setEnabled" return="void" abstract="false" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public">
<parameter name="p0" type="boolean"/>
</method>
</add-node>
<!--The fix for this scenario was to change the name of the method from "setEnabled" to "SetEnabled". This resolved both errors-->
<add-node path="/api/package[@name='com.mycompany.mypackage']/class[@name='DefaultTimeBar']">
<method name="SetEnabled" return="void" abstract="false" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public">
<parameter name="p0" type="boolean"/>
</method>
</add-node>
我的怀疑是,当接口成员被命名为"getX()"或"setX()"时,编译器将其视为get/set属性。 在上述setEnabled(bool)
的情况下,当方法名属性为小写时,该方法将实现为override
。随后产生错误:找不到合适的替代方法。 当更改为大写时,它将正确实现virtual
。我的推理是由于当方法名称在 .aar 文件中不以 get/set 开头时不会发生相同的行为。
场景 2:
错误 [类名]。[methodName]:找不到合适的方法来覆盖收到的,除非对特定方法进行以前的元数据转换。我的方法被命名为SetFullScreen(bool)
所以我认为这是由于编译器错误地将其视为 getter/setter 的相同问题。我的解决方案是删除该方法,然后重新添加名称前导字母大写的方法。我只是从绑定项目目录objDebugapi.xml
中的 api.xml 文件中复制了该方法的详细信息。
<remove-node path="/api/package[@name='com.mycompany.mypackage']/class[@name='VideoPlayerViewExo']/method[@name='setFullScreen' and count(parameter)=1 and parameter[1][@type='boolean']]"/>
<add-node path="/api/package[@name='com.mycompany.mypackage']/class[@name='VideoPlayerViewExo']">
<method abstract="false" deprecated="not deprecated" final="false" name="SetFullScreen" jni-signature="(Z)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
<parameter name="fullscreen" type="boolean" jni-type="Z">
</parameter>
</method>
</add-node>