一旦BarcodePickerController显示,通过MonoTouch使用RedLaser SDK就会崩溃

时间:2012-04-06 08:41:51

标签: c# xamarin.ios barcode barcode-scanner

我正在使用Chris Branson的RedLaser MonoTouch绑定和样本来自: https://github.com/chrisbranson/RedLaserSample

首先,为了帮助那些也遇到这个示例项目问题的人,我不得不更新makefile以构建RedLaser.dll MonoTouch绑定,并更新示例MonoDevelop csproj以获得实际的应用程序编译。

  • 生成文件
    Chris提供的makefile解压缩了RedLaser SDK下载,但RedLaser改变了他们的命名约定,因此不再有效。我简化了它,而不是要求用户手动将libRedLaserSDK.a文件放入构建目录中:

    BTOUCH=/Developer/MonoTouch/usr/bin/btouch
    BUILDVER=build139
    VERSION=3.2.4
    BINDIR=./bin/
    
    all: $(BINDIR)RedLaser.dll
    
    $(BINDIR)libRedLaserSDK.a: 
        @echo "You'll need to obtain a copy of RedLaserDevSDK-$(VERSION).zip from"
        @echo "http://redlaser.com/sdk/index.php"
        @echo Locate the libRedLaserSDK.a file and place within
        @echo $(BINDIR)
        @echo 
        @open http://redlaser.com/sdk/index.php
        @exit 1
    
    $(BINDIR)RedLaser.dll: Makefile AssemblyInfo.cs RedLaser.cs enums.cs $(BINDIR)libRedLaserSDK.a
        $(BTOUCH) --out=$@ -e RedLaser.cs enums.cs AssemblyInfo.cs --link-with=$(BINDIR)libRedLaserSDK.a,libRedLaserSDK.a
    
    clean:
        -rm -rf $(BINDIR)*.dll  
    

    包含makefile的目录还应包含文件redlaser.csenums.csAssemblyInfo.cs(即与Chris相同)。

  • MonoDevelop项目构建设置
    我认为这个停止工作的原因是MonoDevelop或MonoTouch中的一个错误,以及当它们包含引号时它扩展'附加mtouch参数'的方式。克里斯的原始论点看起来像这样:

    -cxx -gcc_flags="-framework SystemConfiguration -framework CFNetwork -framework CoreVideo -framework CoreMedia -framework AVFoundation -framework OpenGLES -framework Security -L${ProjectDir}/Lib -lRedLaserSDK -ObjC"  
    

    MonoDevelop不会正确解析这个问题,而是在每个选项周围插入一个由空格分隔的引号。查看构建输出(在“编译为本机代码”下)显示它已扩展为:

    "/Users/tyson/Downloads/chrisbranson-RedLaserSample-1a5545f-1/RedLaserSample/Lib/RedLaser.dll" -debug -nolink -sdk "5.1" -targetver "5.1" --armv7 "-cxx" "-gcc_flags=\"-framework" "SystemConfiguration" "-framework" "CFNetwork" "-framework" "CoreVideo" "-framework" "CoreMedia" "-framework" "AVFoundation" "-framework" "OpenGLES" "-framework" "Security" "-L/Users/tyson/Downloads/chrisbranson-RedLaserSample-1a5545f-1/RedLaserSample/Lib" "-lRedLaserSDK" "-ObjC\""  
    

    解决方案涉及在整个'gcc_flags'选项周围添加显式引号,手动转义内部引号。 e.g:

    "-cxx" "-gcc_flags=\"-framework SystemConfiguration -framework CFNetwork -framework CoreVideo -framework CoreMedia -framework AVFoundation -framework OpenGLES -framework Security -L${ProjectDir}/Lib -lRedLaserSDK -ObjC\""  
    

    这正确地扩展为:

    "/Users/tyson/Downloads/chrisbranson-RedLaserSample-1a5545f-1/RedLaserSample/Lib/RedLaser.dll" -debug -nolink -sdk "5.1" -targetver "5.1" --armv7 "-cxx" "-gcc_flags=\"-framework SystemConfiguration -framework CFNetwork -framework CoreVideo -framework CoreMedia -framework AVFoundation -framework OpenGLES -framework Security -L/Users/tyson/Downloads/chrisbranson-RedLaserSample-1a5545f-1/RedLaserSample/Lib -lRedLaserSDK -ObjC\""
    

好的,现在我已经编译了,我试图在手机上运行它。应用程序加载正常,并通过RedLaserSDK.CheckReadyStatus()函数成功调用RedLaser SDK。但只要我点击扫描按钮(加载BarcodePickerController),它就会在RedLaser SDK深处发生本机异常崩溃:

terminate called throwing an exception
Native stacktrace:

0   RedLaserSample                      0x0159d62d mono_handle_native_sigsegv + 244
1   RedLaserSample                      0x015b6251 sigabrt_signal_handler + 112
2   libsystem_c.dylib                   0x319b67ed _sigtramp + 48
3   libsystem_c.dylib                   0x319ac20f pthread_kill + 54
4   libsystem_c.dylib                   0x319a529f abort + 94
5   libc++abi.dylib                     0x34fb1f6b abort_message + 46
6   libc++abi.dylib                     0x34faf34d _ZL17default_terminatev + 24
7   libobjc.A.dylib                     0x358e536f _objc_terminate + 170
8   libc++abi.dylib                     0x34faf3c5 _ZL19safe_handler_callerPFvvE + 76
9   libc++abi.dylib                     0x34faf451 _ZdlPv + 0
10  libc++abi.dylib                     0x34fb079f __cxa_throw + 122
11  RedLaserSample                      0x000404a9 _ZN5zxing6qrcode19FinderPatternFinder18selectBestPatternsEv + 172
12  RedLaserSample                      0x000415e9 _ZN5zxing6qrcode19FinderPatternFinder4findERKNS_11DecodeHintsE + 512
13  RedLaserSample                      0x0003a7f7 _ZN5zxing6qrcode8Detector6detectERKNS_11DecodeHintsE + 366
14  RedLaserSample                      0x00046b97 _ZN5zxing6qrcode12QRCodeReader6decodeENS_3RefINS_12BinaryBitmapEEENS_11DecodeHintsE + 130
15  RedLaserSample                      0x0004ec35 _ZN5zxing6Reader6decodeENS_3RefINS_12BinaryBitmapEEE + 240
16  RedLaserSample                      0x00058455 -[FormatReader decode:] + 116
17  RedLaserSample                      0x00013835 -[ZXingDecoder findCodesInBitmap:bytesPerRow:width:height:] + 656
18  RedLaserSample                      0x0005f6af -[BarcodePhotoEngine zxingFindBarcodesInPixmap:] + 222
19  RedLaserSample                      0x00055f25 __38-[BarcodeEngine findBarcodesInPixMap:]_block_invoke_059 + 76
20  libdispatch.dylib                   0x34635c59 _dispatch_call_block_and_release + 12
21  libdispatch.dylib                   0x34637d0f _dispatch_queue_drain + 274
22  libdispatch.dylib                   0x34637b75 _dispatch_queue_invoke$VARIANT$mp + 40
23  libdispatch.dylib                   0x346387e7 _dispatch_worker_thread2 + 210
24  libsystem_c.dylib                   0x31967dfb _pthread_wqthread + 294
25  libsystem_c.dylib                   0x31967cd0 start_wqthread + 8

=================================================================  
Got a SIGABRT while executing native code. This usually indicates  
a fatal error in the mono runtime or one of the native libraries  
used by your application.  
=================================================================

运行非常相似的RedLaser Xcode示例项目(即没有MonoTouch参与,所有objective-c)都可以正常工作。

此外,如果它具有任何重要性,禁用所有条形码扫描类型允许BarcodePickerController加载并显示摄像机视图。显然,它从未检测到条形码。

2 个答案:

答案 0 :(得分:3)

你提到的崩溃现在是fixed in the bindings

这与QR使用C ++异常和错误的链接参数有关。

答案 1 :(得分:2)

根据您粘贴的Makefile,此RedLaser绑定使用MonoTouch支持的LinkWith [1]功能,无需使用任何“其他mtouch参数”。

只需从项目选项中的其他mtouch参数配置中清除RedLaser所需的任何参数,即可构建&工作正常。

如果没有,请尝试使用https://github.com/xamarin/monotouch-bindings中可能更新的RedLaser绑定?

注意:

  1. http://blog.xamarin.com/2011/11/02/monotouch-native-libraries-made-easy/