Xamarin Android & AIDL: Java .Lang.IllegalStateException: 'Плохие волхвы c число для Bundle - PullRequest
1 голос
/ 04 февраля 2020

Я использую Xamarin Android для подключения к услуге Android. После того, как я автоматически сгенерировал заглушки для файлов .aidl и запустил проект, я обнаружил следующую ошибку:

"Java .Lang.IllegalStateException: 'Bad magi c number for Bundle"

enter image description here

Я использую класс Parceable, который содержит два значения с плавающей точкой.

public class TLGeoPoint : Java.Lang.Object, IParcelable
{
    public float lat { get; set; }
    public float lng { get; set; }

    public TLGeoPoint()
    {

    }

    public TLGeoPoint(Parcel parcel)
    {
        ReadFromParcel(parcel);
    }

    [ExportField("CREATOR")] // Need a reference to Mono.Android.Export
    public static TLGeoPointCreator InitializeCreator()
    {
        return new TLGeoPointCreator();
    }

    public int DescribeContents()
    {
        return 0;
    }

    public void WriteToParcel(Parcel dest, [GeneratedEnum] ParcelableWriteFlags flags)
    {
        dest.WriteFloat(lat);
        dest.WriteFloat(lng);
    }

    public void ReadFromParcel(Parcel parcel)
    {
        lat = parcel.ReadFloat();
        lng = parcel.ReadFloat();
    }
}

public class TLGeoPointCreator : Java.Lang.Object, IParcelableCreator
{
    public Java.Lang.Object CreateFromParcel(Parcel source)
    {
        TLGeoPoint objGeo = new TLGeoPoint();
        objGeo.lat = source.ReadFloat();
        objGeo.lng = source.ReadFloat();
        return objGeo;
    }

    public Java.Lang.Object[] NewArray(int size)
    {
        return new Java.Lang.Object[size];
    }
}

Мне интересно, есть ли ошибка в Xamarin Генерирование кода AIDL, которое вызывает исключение Bag Magi c Number или что-то, чего я не могу добавить.

Обратите внимание, что служба принимает функцию обратного вызова и отправляет данные через этот обратный вызов. Я получаю эту ошибку до вызова обратного вызова.

1 Ответ

0 голосов
/ 05 февраля 2020

Кажется, есть ошибка в генераторе AIDL Xamarin.

Тем временем, пока ошибка не будет устранена на стороне Xamarin, у вас есть несколько вариантов.

  1. Удалить сгенерированный интерфейс AIDL , удалите файлы * .aidl, напишите вручную код IP C. Ох. ​​
  2. Используйте Messenger + Bundle, как описано в этого официального руководства . Для каждого метода будет несколько шаблонов, но этот подход в целом пригоден для использования.
  3. В качестве альтернативы можно переместить код IP C в отдельный библиотечный модуль Java. Если вы это сделаете, вы сможете создать свою прокси-реализацию IP C, используя официальный инструмент aidl или другими способами (например, используя библиотеку , которую я написал для этой цели) .
...