Xamarin Android 绑定不实现接口问题
Xamarin Android binding does not implement interface issue
我有一个 java 的 android 绑定,除了我尝试集成的新功能外,它在某种程度上是可行的。直到现在我才意识到预期的回调没有发生。这是有问题的 classes(反编译为 java):
在顶层我们有
public interface MyPackage {
MyPackage.Companion Companion = MyPackage.Companion.$$INSTANCE;
public static final class Companion {
@Nullable
private static MyEventHandler myEventHandler;
// $FF: synthetic field
static final MyPackage.Companion $$INSTANCE;
@Nullable
public final MyEventHandler getMyEventHandler() {
return myEventHandler;
}
public final void setMyEventHandler(@Nullable MyEventHandler var1) {
myEventHandler = var1;
}
private Companion() {
}
static {
MyPackage.Companion var0 = new MyPackage.Companion();
$$INSTANCE = var0;
}
}
}
MyEventHandler
class:
public abstract class MyEventHandler {
public abstract void handleEvent(@NotNull String var1, @NotNull Properties var2);
}
Properties
class:
import java.util.Map;
public class Properties extends r {
public Properties() {
}
Properties(Map<String, Object> var1) {
super(var1);
}
public Properties a(String var1, Object var2) {
super.b(var1, var2);
return this;
}
}
和有问题的 r
class:
public class r implements Map<String, Object> {
private final Map<String, Object> a;
various implementations...
}
因此,当我无法在集成级别覆盖 HandleEvent
方法并开始查看绑定日志并发现:
时,我注意到了这个问题
警告=>
BINDINGSGENERATOR: Warning BG8801: Invalid parameter type MyPackage...Properties in method HandleEvent in managed type MyPackage.MyEventHandler. (BG8801)
在构建日志中:
message BG0000: warning BG8102: Class MyPackage....Properties has unknown base type MyPackage....r.
warning BG8801: Invalid parameter type MyPackage...Properties in method HandleEvent in managed type MyPackage.MyEventHandler.
很明显 r
是一个混淆的 class 我需要对我的 Metadata
进行检查所以我继续前进并弹出:
<attr path="/api/package[@name='MyPackage']/class[@name='r']" name="obfuscated">false</attr>
这导致生成 R
但现在我得到以下 5 个编译错误:
Error CS0535: 'R' does not implement interface member 'IMap.EntrySet()' (CS0535)
Error CS0738: 'R' does not implement interface member 'IMap.KeySet()'. 'R.KeySet()' cannot implement 'IMap.KeySet()' because it does not have the matching return type of 'ICollection'. (CS0738)
Error CS0535: 'R' does not implement interface member 'IMap.Put(Object?, Object?)' (CS0535)
Error CS0535: 'R' does not implement interface member 'IMap.PutAll(IDictionary?)' (CS0535)
Error CS0738: 'R' does not implement interface member 'IMap.Values()'. 'R.Values()' cannot implement 'IMap.Values()' because it does not have the matching return type of 'ICollection'. (CS0738)
我尝试使用
创建托管 return
<attr path="/api/package[@name='MyPackage']/class[@name='r']/method[@name='entrySet' and count(parameter)=0]" name="managedReturn">Java.Util.IMap</attr>
编译错误数与上述相同。然后我尝试使用以下方法删除节点:
<remove-node path="/api/package[@name='MyPackage']/class[@name='r']/method[@name='entrySet']"/>
仍然没有运气。 :(
我在这里错过了什么?任何 pointers/suggestions 将不胜感激!
您似乎在尝试将 Map 公开给 C#,正如您所说,Java泛型处理得不是很好。
在一个非常流行的社交网络中,您收到了@mattleibow 的回复。我不相信他的回答,但我还是去检查了一下,看起来还不错。
如果你看Java.Lang.HashMap类型的描述
https://docs.microsoft.com/en-us/dotnet/api/java.util.hashmap?view=xamarin-android-sdk-9很适合你曝光
你也可以试试对应的接口,安全性更好https://docs.microsoft.com/en-us/dotnet/api/java.util.imap?view=xamarin-android-sdk-9
如果可行,您仍然需要自己转换类型。
请回复评论说问题已经解决了为了子孙后代的到来 post :D
信用不是我的所以不要给我:-)
约翰,
我通过在部分 class 中提供上述方法的实现来解决它。基本上在 Additions
文件夹下添加了一个名为 R.cs
的新文件,如下所示:
namespace YourNameSpace
{
public partial class R
{
public void PutAll(System.Collections.IDictionary p0)
{
PutAll(p0);
}
public Java.Lang.Object Put(Java.Lang.Object key, Java.Lang.Object value)
{
return Put(key, value);
}
public System.Collections.ICollection EntrySet()
{
return EntrySet();
}
public System.Collections.ICollection KeySet()
{
return KeySet();
}
public System.Collections.ICollection Values()
{
return Values();
}
}
}
我无法通过添加 XML 转换使其工作,但我认为存在一些工具问题。
我有一个 java 的 android 绑定,除了我尝试集成的新功能外,它在某种程度上是可行的。直到现在我才意识到预期的回调没有发生。这是有问题的 classes(反编译为 java):
在顶层我们有
public interface MyPackage {
MyPackage.Companion Companion = MyPackage.Companion.$$INSTANCE;
public static final class Companion {
@Nullable
private static MyEventHandler myEventHandler;
// $FF: synthetic field
static final MyPackage.Companion $$INSTANCE;
@Nullable
public final MyEventHandler getMyEventHandler() {
return myEventHandler;
}
public final void setMyEventHandler(@Nullable MyEventHandler var1) {
myEventHandler = var1;
}
private Companion() {
}
static {
MyPackage.Companion var0 = new MyPackage.Companion();
$$INSTANCE = var0;
}
}
}
MyEventHandler
class:
public abstract class MyEventHandler {
public abstract void handleEvent(@NotNull String var1, @NotNull Properties var2);
}
Properties
class:
import java.util.Map;
public class Properties extends r {
public Properties() {
}
Properties(Map<String, Object> var1) {
super(var1);
}
public Properties a(String var1, Object var2) {
super.b(var1, var2);
return this;
}
}
和有问题的 r
class:
public class r implements Map<String, Object> {
private final Map<String, Object> a;
various implementations...
}
因此,当我无法在集成级别覆盖 HandleEvent
方法并开始查看绑定日志并发现:
警告=>
BINDINGSGENERATOR: Warning BG8801: Invalid parameter type MyPackage...Properties in method HandleEvent in managed type MyPackage.MyEventHandler. (BG8801)
在构建日志中:
message BG0000: warning BG8102: Class MyPackage....Properties has unknown base type MyPackage....r.
warning BG8801: Invalid parameter type MyPackage...Properties in method HandleEvent in managed type MyPackage.MyEventHandler.
很明显 r
是一个混淆的 class 我需要对我的 Metadata
进行检查所以我继续前进并弹出:
<attr path="/api/package[@name='MyPackage']/class[@name='r']" name="obfuscated">false</attr>
这导致生成 R
但现在我得到以下 5 个编译错误:
Error CS0535: 'R' does not implement interface member 'IMap.EntrySet()' (CS0535)
Error CS0738: 'R' does not implement interface member 'IMap.KeySet()'. 'R.KeySet()' cannot implement 'IMap.KeySet()' because it does not have the matching return type of 'ICollection'. (CS0738)
Error CS0535: 'R' does not implement interface member 'IMap.Put(Object?, Object?)' (CS0535)
Error CS0535: 'R' does not implement interface member 'IMap.PutAll(IDictionary?)' (CS0535)
Error CS0738: 'R' does not implement interface member 'IMap.Values()'. 'R.Values()' cannot implement 'IMap.Values()' because it does not have the matching return type of 'ICollection'. (CS0738)
我尝试使用
创建托管 return<attr path="/api/package[@name='MyPackage']/class[@name='r']/method[@name='entrySet' and count(parameter)=0]" name="managedReturn">Java.Util.IMap</attr>
编译错误数与上述相同。然后我尝试使用以下方法删除节点:
<remove-node path="/api/package[@name='MyPackage']/class[@name='r']/method[@name='entrySet']"/>
仍然没有运气。 :(
我在这里错过了什么?任何 pointers/suggestions 将不胜感激!
您似乎在尝试将 Map 公开给 C#,正如您所说,Java泛型处理得不是很好。
在一个非常流行的社交网络中,您收到了@mattleibow 的回复。我不相信他的回答,但我还是去检查了一下,看起来还不错。
如果你看Java.Lang.HashMap类型的描述 https://docs.microsoft.com/en-us/dotnet/api/java.util.hashmap?view=xamarin-android-sdk-9很适合你曝光
你也可以试试对应的接口,安全性更好https://docs.microsoft.com/en-us/dotnet/api/java.util.imap?view=xamarin-android-sdk-9
如果可行,您仍然需要自己转换类型。
请回复评论说问题已经解决了为了子孙后代的到来 post :D
信用不是我的所以不要给我:-)
约翰,
我通过在部分 class 中提供上述方法的实现来解决它。基本上在 Additions
文件夹下添加了一个名为 R.cs
的新文件,如下所示:
namespace YourNameSpace
{
public partial class R
{
public void PutAll(System.Collections.IDictionary p0)
{
PutAll(p0);
}
public Java.Lang.Object Put(Java.Lang.Object key, Java.Lang.Object value)
{
return Put(key, value);
}
public System.Collections.ICollection EntrySet()
{
return EntrySet();
}
public System.Collections.ICollection KeySet()
{
return KeySet();
}
public System.Collections.ICollection Values()
{
return Values();
}
}
}
我无法通过添加 XML 转换使其工作,但我认为存在一些工具问题。