2016-06-28 6 views
1

Ich erhalte einen AbstractMethodError, wenn ich versuche, X von einem Java.Lang.Object zu erhalten.Zugreifen auf Eigenschaften von Java-Bibliotheksschnittstelle in Xamarin

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(); 
     } 
} 

Wo CartesianFloat ist eine Implementierung von 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()); 
    } 

} 

Wenn ich versuche Wert als CartesianFloat zu werfen, heißt es kein Verfahren X() auf Wert vorhanden ist.

eine Uhr auf Wert Einlochen, hat einen Wert von {(-0,062, 0,070, 1,010)}

+0

was ist 'message.GetData (kartesisch)' ?? –

+0

@ Sven-Michael Stübe, Es ist ein CartesianFloat Objekt –

+0

Ich meine was macht es? Was sind Nachrichten? Es ist nicht in Ihrem Code deklariert. –

Antwort

0

Metwear API in BLE Paket codierte Daten sendet und man kann es folgenden Code dekodieren. Ich übersetzte es (als optimiert) von ihrem Java-Code.

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; 
} 
Verwandte Themen