2016-06-25 91 views
1

我使用AAR为Xamarin项目创建了一个Android绑定库。将Java移植到C#for Xamarin Android库

我现在正在尝试实现该库。

下面是使用该库的代码的Java代码:

Java代码:

new AsyncOperation.CompletionHandler<RouteManager>(){ 
    @Override 
    public void success(RouteManager result){ 
     result.subscribe(ACCEL_DATA, new RouteManager.MessageHandler(){ 
     @Override 
     public void process(Message message){ 
      Log.i(LOG_TAG,message) 
     } 
    } 
} 

我想端口这段代码C#。

我的C#代码,从C#的包装从绑定库创建:

class AsyncOperationHandler : AsyncOperationCompletionHandler 
{ 
    public override unsafe void Success(Object p0) 
    { 
      try 
      { 
       var routeManger = (IRouteManager)p0; 
       routeManger.Subscribe(ACCEL_DATA, new RouteMessageHandler()); 
      } 
      catch (Exception) 
      { 
      Log.Error(LOG_TAG, "Error"); 
      } 
    } 
} 

class RouteMessageHandler : IRouteManagerMessageHandler 
{ 
     public void Dispose() 
     { 
      throw new NotImplementedException(); 
     } 
     public IntPtr Handle { get; } 
     public void Process(Message p0) 
     { 
      var message = p0; 
      Log.Info(LOG_TAG, message); 
     } 
} 

我得到在上routeManger.Subscribe行的C#包装错误。

当RouteManagerMessageHandler被初始化时,它得到句柄,然后在绑定库中抛出一个空指针异常。

这是将Java接口移植到C#的正确方法吗?

回答

2

如果您实施Java接口,则必须从Java.Lang.Object派生。

class RouteMessageHandler : Java.Lang.Object, IRouteManagerMessageHandler 
{ 
    public void Process(Message p0) 
    { 
     var message = p0; 
     Log.Info(LOG_TAG, message); 
    } 
} 

在编译输出中应该有一些东西。

类型'AppXYZ.RouteMessageHandler'实现IRouteManagerMessageHandler,但不从Java.Lang.Object继承。它不受支持。