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的支持人员似乎无法告诉我如何实现这一目标。
设备上是否已存在所需的本机库(已部署为自定义Android版本的一部分)?为了验证这一假设,我安装了Famoco样本激光扫描应用程序,即使在其项目源工具包中没有.so文件的迹象,该应用程序也可以正常运行。
如果是这样,从Android环境中查找并提取.so文件是否可行,我该怎么办?
答案 0 :(得分:1)
是的,应该在自定义设备上预安装 libbarcodereader44.so 文件。它可以在/ system / lib或/ vendor / lib目录中。您必须在调用open ()
方法之前从代码中加载该库。 Here您可以找到有关Famoco SDK的更多详细信息。