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 и как мне это сделать?