将Java移植到C#for Xamarin Android Library

时间:2016-06-25 07:41:46

标签: java c# android xamarin shared-libraries

我使用AAR为我的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初始化时,它获取Handle,然后在Binding Library中抛出一个空指针异常。

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

1 个答案:

答案 0 :(得分: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继承。它不受支持。