2016-06-28 67 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; 
}