2016-06-28 9 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:私は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()); 
    } 

} 

、それは法のX()が値に存在しないと言います。値に時計を置く

は、{(-0.062、0.070、1.010)}

+0

「message.GetData(デカルト)」とは何ですか? –

+0

@ Sven-MichaelStübe、それはCartesianFloatオブジェクトです –

+0

どういう意味ですか?メッセージとは何ですか?あなたのコードでは宣言されていません。 –

答えて

0

MetwearのAPIの値は、BLEパケットに符号化データを送信し、次のコードを使用して復号することができます。彼らの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; 
} 
関連する問題