从Xamarin中的Java绑定库接口访问属性
我在尝试从Java.Lang.Object获取X时遇到AbstractMethodError从Xamarin中的Java绑定库接口访问属性,java,c#,xamarin,java-native-interface,Java,C#,Xamarin,Java Native Interface,我在尝试从Java.Lang.Object获取X时遇到AbstractMethodError class DataMessageHandler : Java.Lang.Object, IRouteManagerMessageHandler { public void Process(Message p0) { var message = p0; var cartesian = Class.FromType(typeof(Cart
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 ());
}
}
public不安全卡特尔贷款()
:base(IntPtr.Zero、JniHandleOwnership.DoNotTransfer)
{
if(Handle!=IntPtr.Zero)
返回;
试一试{
if(GetType()!=typeof(CartesianFloat)){
设定手柄(
全局::Android.Runtime.JNIEnv.StartCreateInstance(GetType(),“()V”),
JniHandleOwnership.TransferLocalRef);
全局::Android.Runtime.JNIEnv.FinishCreateInstance(句柄,“()V”);
返回;
}
if(id_ctor==IntPtr.Zero)
id_ctor=JNIEnv.GetMethodID(class_ref,“,”()V”);
设定手柄(
global::Android.Runtime.JNIEnv.StartCreateInstance(class\u ref,id\u ctor),
JniHandleOwnership.TransferLocalRef);
JNIEnv.FinishCreateInstance(句柄、类引用、id引用);
}最后{
}
}
//此方法作为实例化Com.Mbientlab.Metawear.Data.ICartesian的成员显式实现
全局::Java.Lang.Object全局::Com.Mbientlab.Metawear.Data.ICartesian.X()
{
返回global::Java.Interop.JavaObjectExtensions.JavaCast(((ICartesian)this.X());
}
//此方法作为实例化Com.Mbientlab.Metawear.Data.ICartesian的成员显式实现
全局::Java.Lang.Object全局::Com.Mbientlab.Metawear.Data.ICartesian.Y()
{
返回global::Java.Interop.JavaObjectExtensions.JavaCast(((ICartesian)this.Y());
}
//此方法作为实例化Com.Mbientlab.Metawear.Data.ICartesian的成员显式实现
全局::Java.Lang.Object全局::Com.Mbientlab.Metawear.Data.ICartesian.Z()
{
返回global::Java.Interop.JavaObjectExtensions.JavaCast(((ICartesian)this.Z());
}
}
若我试图将值强制转换为CartesianFloat,它会说value上不存在方法X()
将手表置于值上,其值为{(-0.062,0.070,1.010)}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;
}
公共作废流程(消息p0)
{
var消息=p0作为BMI消息;
var data=message.GetData();
var x=((短)(data[1]Metwear API在BLE数据包中发送编码数据,您可以使用以下代码对其进行解码
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;
}
公共作废流程(消息p0)
{
var消息=p0作为BMI消息;
var data=message.GetData();
var x=((短)(数据[1]什么是message.GetData(笛卡尔)
??@Sven Michael Stübe,这是一个笛卡尔自由目标。我的意思是它在做什么?什么是消息?它没有在你的代码中声明。我的意思是它在做什么?什么是消息?它没有在你的代码中声明。@Sven Michael Stübe。道歉,编辑问题。消息是什么。GetData(笛卡尔)
??@Sven Michael Stübe,这是一个CartesianFloat目标我的意思是它在做什么?什么是消息?它没有在你的代码中声明。我的意思是它在做什么?什么是消息?它没有在你的代码中声明。@Sven Michael Stübe。道歉,编辑问题。