2016-06-28 64 views
1

嘗試從Java.Lang.Object獲取X時,出現AbstractMethodError。從Xamarin中的Java綁定庫接口訪問屬性

class DataMessageHandler : Java.Lang.Object, IRouteManagerMessageHandler 
{ 
     public void Process(Message p0) 
     { 
      var message = p0; 
      var cartesian = Class.FromType(typeof(CartesianFloat)); 

      var value = (ICartesian)message.GetData(cartesian); 
      var x = value.X(); 
     } 
} 

其中CartesianFloat是ICartesian的實現。

ICartesian:

[global::Java.Interop.JavaTypeParameters (new string [] {"T extends java.lang.Number"})] 
public partial interface ICartesian : IJavaObject { 

    // Metadata.xml XPath method reference: path="/api/package[@name='com.mbientlab.metawear.data']/interface[@name='Cartesian']/method[@name='x' and count(parameter)=0]" 
    [Register ("x", "()Ljava/lang/Number;", "GetXHandler:Com.Mbientlab.Metawear.Data.ICartesianInvoker, MetaWearAndroid")] 
    global::Java.Lang.Object X(); 

    // Metadata.xml XPath method reference: path="/api/package[@name='com.mbientlab.metawear.data']/interface[@name='Cartesian']/method[@name='y' and count(parameter)=0]" 
    [Register ("y", "()Ljava/lang/Number;", "GetYHandler:Com.Mbientlab.Metawear.Data.ICartesianInvoker, MetaWearAndroid")] 
    global::Java.Lang.Object Y(); 

    // Metadata.xml XPath method reference: path="/api/package[@name='com.mbientlab.metawear.data']/interface[@name='Cartesian']/method[@name='z' and count(parameter)=0]" 
    [Register ("z", "()Ljava/lang/Number;", "GetZHandler:Com.Mbientlab.Metawear.Data.ICartesianInvoker, MetaWearAndroid")] 
    global::Java.Lang.Object Z(); 

} 

CartesianFloat:

 public unsafe CartesianFloat() 
     : base (IntPtr.Zero, JniHandleOwnership.DoNotTransfer) 
    { 
     if (Handle != IntPtr.Zero) 
      return; 

     try { 
      if (GetType() != typeof (CartesianFloat)) { 
       SetHandle (
         global::Android.Runtime.JNIEnv.StartCreateInstance (GetType(), "()V"), 
         JniHandleOwnership.TransferLocalRef); 
       global::Android.Runtime.JNIEnv.FinishCreateInstance (Handle, "()V"); 
       return; 
      } 

      if (id_ctor == IntPtr.Zero) 
       id_ctor = JNIEnv.GetMethodID (class_ref, "<init>", "()V"); 
      SetHandle (
        global::Android.Runtime.JNIEnv.StartCreateInstance (class_ref, id_ctor), 
        JniHandleOwnership.TransferLocalRef); 
      JNIEnv.FinishCreateInstance (Handle, class_ref, id_ctor); 
     } finally { 
     } 
    } 

    // This method is explicitly implemented as a member of an instantiated Com.Mbientlab.Metawear.Data.ICartesian 
    global::Java.Lang.Object global::Com.Mbientlab.Metawear.Data.ICartesian.X() 
    { 
     return global::Java.Interop.JavaObjectExtensions.JavaCast<Java.Lang.Object>(((ICartesian) this).X()); 
    } 

    // This method is explicitly implemented as a member of an instantiated Com.Mbientlab.Metawear.Data.ICartesian 
    global::Java.Lang.Object global::Com.Mbientlab.Metawear.Data.ICartesian.Y() 
    { 
     return global::Java.Interop.JavaObjectExtensions.JavaCast<Java.Lang.Object>(((ICartesian) this).Y()); 
    } 

    // This method is explicitly implemented as a member of an instantiated Com.Mbientlab.Metawear.Data.ICartesian 
    global::Java.Lang.Object global::Com.Mbientlab.Metawear.Data.ICartesian.Z() 
    { 
     return global::Java.Interop.JavaObjectExtensions.JavaCast<Java.Lang.Object>(((ICartesian) this).Z()); 
    } 

} 

如果我嘗試投值CartesianFloat,它說存在價值沒有方法X()。

把一個觀看有關值,在BLE分組中的{(-0.062,0.070,1.010)}

+0

什麼是'message.GetData(笛卡爾)'? –

+0

@ Sven-MichaelStübe,這是一個笛卡爾的對象 –

+0

我的意思是它在做什麼?什麼是信息?它沒有在你的代碼中聲明。 –

回答

0

Metwear API發送編碼的數據的值,並且可以使用下面的代碼進行解碼。我從他們的java代碼中翻譯了它(而不是優化)。

public void Process(Message p0) 
    { 
    var message = p0 as Bmi160ThreeAxisMessage; 
    var data = message.GetData(); 
    var x = ((short)(data[1] << 8 | data[0]))/message.Scale; 
    var y = ((short)(data[3] << 8 | data[2]))/message.Scale; 
    var z = ((short)(data[5] << 8 | data[4]))/message.Scale; 
}