一个好老好老的老程序员了。
全部博文(915)
分类: Android平台
2014-06-17 20:44:31
首先要安装Xariman.Android。然后从和动态库文件。
首先需要使用Xariman.Android的Java Bindings Library功能,将zbar.jar变成.net调用的DLL文件。需要将zbar.jar的生成操作修改为EmbeddedJar。在转换过程中可能会发生错误:
错误 29 “Net.Sourceforge.Zbar.SymbolIterator”不实现接口成员“Java.Util.IIterator.Next()”。“Net.Sourceforge.Zbar.SymbolIterator.Next()”无法实现“Java.Util.IIterator.Next()”,因为它没有匹配的返回类型“Java.Lang.Object”。
没有关系,直接修改转换后的.cs文件。将返回类型由Net.Sourceforge.Zbar.Symbol改变成Java.Lang.Object。编译就能通过了。
其次,创建一个Android Application。引用刚才生成的Binding Library生成的DLL文件。创建一个目录Libs,下面包含armeabi和armeabi-v7a、X86(目前X86不支持so文件的引用),将其中的.so文件的生成操作修改为AndroidNativeLibrary类型(否则在加载动态库时会出错)。
然后参照ZBar官方的Example,将其中的Java代码修改为C#代码。
在代码转换过程中,需要注意的是CameraTestActivity中定义的autoFocusCB,previewCb,beepListener在Java中可以通过new Interface的方式直接实例。但在C#中不能这样做。所以需要让CameraTestActivity实现MediaPlayer.IOnCompletionListener, Camera.IPreviewCallback, Camera.IAutoFocusCallback三个接口。在OnCreate中将三个变量设置为this就可以了。如:this.autoFocusCB = this;
还有是doAutoFocus在Java中是线程,在C#中使用Action。
在OnPreviewFrame中,Java对结果直接Foreach,但C#中不行。需要如下实现:
Java.Util.IIterator syms = scanner.Results.Iterator();
while (syms.HasNext)
{
Symbol
sym = syms.Next().JavaCast
if (sym != null)
{
Intent intent = new Intent();
intent.PutExtra("Code", sym.Data);
this.SetResult(Result.Ok, intent);
}
this.Finish();
}
其中红色的类型转换很重要。
详细的工程参照附件。
ZBarNet.rar