【问题标题】:Accessing properties from Java Binding Library Interface in Xamarin从 Xamarin 中的 Java 绑定库接口访问属性
【发布时间】:2016-06-28 11:54:55
【问题描述】:

我在尝试从 Java.Lang.Object 获取 X 时遇到 AbstractMethodError。

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 的实现。

笛卡尔:

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

}

笛卡尔浮点数:

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

}

如果我尝试将 value 转换为 CartesianFloat,它会说 value 上不存在方法 X()。

将 Watch 置于值上,其值为 {(-0.062, 0.070, 1.010)}

【问题讨论】:

  • 什么是message.GetData(cartesian) ??
  • @Sven-Michael Stübe , 它是一个 CartesianFloat 对象
  • 我的意思是它在做什么?什么是消息?它没有在你的代码中声明。
  • 我的意思是它在做什么?什么是消息?它没有在你的代码中声明。
  • @Sven-Michael Stübe。抱歉,已编辑问题。 mbientlab.com/docs/metawear/android/latest/com/mbientlab/…

标签: java c# xamarin java-native-interface


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2018-03-12
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多