Xamarin.Android Java绑定库运行时失败访问本机库

宝剑锋从磨砺出,梅花香自苦寒来。这篇文章主要讲述Xamarin.Android Java绑定库运行时失败访问本机库相关的知识,希望能为你提供帮助。
TL; DR:我正在寻找一种从运行特定于供应商的自定义android构建的Android设备中查找和提取本机共享库(.so)文件的方法。我需要这个文件作为Xamarin.Android java绑定库中的缺失部分。
我正在尝试为Java SDK创建一个Xamarin.Android绑定库,该库在Famoco的Android设备上公开激光条形码扫描API。这些设备运行特定于供应商的Android构建,该构建支持一些特殊功能,例如集中式设备管理。
我跟着usual procedures创建了绑定库,没有使用任何自定义转换或添加,并且没有编译器错误。
以下是在绑定库中生成的工厂方法,它尝试创建新的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)
我从troubleshooting guidelines那里了解到,这种类型的故障通常是由无法解析所需的本机库引起的。
为了确认这是原因,我使用JD-GUI对Famoco JAR进行反编译,从中我提取了以下实现代码片段:
// 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代码中实现,而是在我的绑定库项目中未引用的本机库中单独实现。这看起来像是一个合理的诊断吗?
不幸的是,我没有在Famoco提供的SDK工具包中找到任何.so(本机库)文件。我联系了他们的支持团队,他们表示在使用SDK JAR时没有必要链接.so文件。 Famoco并不热衷于在他们的设备上支持跨平台应用程序,但他们确实确认他们有其他客户使用Xamarin,他们似乎已经解决了这个问题。不幸的是,Famoco支持似乎无法告诉我如何实现这一目标。
【Xamarin.Android Java绑定库运行时失败访问本机库】可能是设备上已存在所需的本机库(部署为自定义Android构建的一部分)?为了验证这个假设,我安装了Famoco样本激光扫描应用程序,该应用程序运行正常,即使项目源代码包中没有.so文件的迹象。
如果是这样,从Android环境中查找和提取.so文件是否可行,我该怎么做?
答案是的,libbarcodereader44.so文件应该预先安装在自定义设备上。它可以位于/ system / lib或/ vendor / lib目录中。在调用open ()方法之前,必须从代码中加载此库。 Here您可以找到有关Famoco SDK的更多详细信息。

    推荐阅读