Xamarin.Android Сбой времени выполнения библиотеки привязок Java при доступе к собственной библиотеке - PullRequest
1 голос
/ 23 апреля 2019

TL; DR: я ищу способ найти и извлечь собственный файл общей библиотеки (.so) с устройства Android, на котором выполняется специализированная сборка Android для конкретного поставщика.Мне нужен этот файл как отсутствующий фрагмент в библиотеке привязок Java Xamarin.Android.

Я пытаюсь создать библиотеку привязок Xamarin.Android для Java SDK, которая предоставляет API-интерфейсы сканирования лазерного штрих-кода на устройствах Famoco на Android.На этих устройствах выполняется сборка Android для конкретного поставщика, которая поддерживает некоторые специальные функции, такие как централизованное управление устройствами.

Я следовал обычным процедурам , чтобы создать библиотеку привязок, без использования каких-либо пользовательских преобразований или дополнений, и не было ошибок компилятора.

Вот фабричный метод,генерируется в библиотеке привязок, которая пытается создать новый экземпляр BarCodeReader:

[Register ("open", "(ILandroid/content/Context;)Lcom/zebra/adc/decoder/BarCodeReader;", "")]
public static unsafe global::Com.Zebra.Adc.Decoder.BarCodeReader Open (int readerId, global::Android.Content.Context context)
{
    const string __id = "open.(ILandroid/content/Context;)Lcom/zebra/adc/decoder/BarCodeReader;";
    try {
        JniArgumentValue* __args = stackalloc JniArgumentValue [2];
        __args [0] = new JniArgumentValue (readerId);
        __args [1] = new JniArgumentValue ((context == null) ? IntPtr.Zero : ((global::Java.Lang.Object) context).Handle);
        var __rm = _members.StaticMethods.InvokeObjectMethod (__id, __args);
        return global::Java.Lang.Object.GetObject<global::Com.Zebra.Adc.Decoder.BarCodeReader> (__rm.Handle, JniHandleOwnership.TransferLocalRef);
    } finally {
    }
}

Приведенный выше код завершается ошибкой при выполнении следующей строки:

var __rm = _members.StaticMethods.InvokeObjectMethod (__id, __args);

Выдается исключение:No implementation found for void com.zebra.adc.decoder.BarCodeReader.native_setup(java.lang.Object, int, java.lang.Object).

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

В попыткеподтвердив это как причину, я использовал JD-GUI для декомпиляции JAR Famoco, из которого я извлек следующие фрагменты кода реализации:

// This is the underlying Java implementation of the above bindings library factory method
public static BarCodeReader open(int readerId, Context context)
{
    return new BarCodeReader(readerId, context);
}

// This is the BarCodeReader constructor that is called by the factory method
BarCodeReader(int readerId, Context context)
{
    this.mEventHandler = null;
    this.mAutoFocusCallback = null;
    this.mDecodeCallback = null;
    this.mErrorCallback = null;
    this.mPreviewCallback = null;
    this.mSnapshotCallback = null;
    this.mVideoCallback = null;
    this.mZoomListener = null;

    Looper aLooper = Looper.myLooper();
    if (null == aLooper) {
        aLooper = Looper.getMainLooper();
    }
    if (aLooper != null) {
        this.mEventHandler = new EventHandler(this, aLooper);
    }
    native_setup(new WeakReference(this), readerId, context);
}

// This method is called by the above constructor, but fails because no implementation exists
private final native void native_setup(Object paramObject, int paramInt);

Мне кажется, что приведенная выше ошибка во время выполнения происходит из-зазакрытый метод native_setup не реализован в коде Java, но отдельно в собственной библиотеке, на которую нигде нет ссылокмой проект библиотеки привязок.Кажется ли это разумным диагнозом?

К сожалению, я не нашел никаких файлов .so (нативная библиотека) в комплекте SDK, поставляемом Famoco.Я связался с их службой поддержки, которая заявила, что нет необходимости связывать файл .so при использовании их SDK JAR.Famoco не стремится поддерживать кроссплатформенные приложения на своих устройствах, но они подтвердили, что у них есть другие клиенты, использующие Xamarin, которые, похоже, решили эту проблему.К сожалению, поддержка Famoco, похоже, не может сказать мне, как этого добиться.

Может ли быть, что на устройстве уже существует необходимая встроенная библиотека (развернутая как часть пользовательской сборки Android)?Чтобы проверить эту гипотезу, я установил приложение для лазерного сканирования образцов Famoco, которое работает правильно, даже если в его исходном наборе проекта нет никаких признаков файла .so.

Если это так, возможно ли найти иизвлечь файл .so из среды Android и как мне это сделать?

1 Ответ

1 голос
/ 23 апреля 2019

Да, файл libbarcodereader44.so должен быть предварительно установлен на пользовательском устройстве. Это может быть либо в / system / lib, либо в каталоге / vendor / lib. Вы должны загрузить эту библиотеку из своего кода перед вызовом метода open (). Здесь вы можете найти более подробную информацию о Famoco SDK.

...