4

ここから Chris Branson の RedLaser MonoTouch バインディングとサンプルを使用しています: https://github.com/chrisbranson/RedLaserSample

まず、このサンプル プロジェクトでも問題を抱えている人を助けるために、RedLaser.dll MonoTouch バインディングをビルドするためのメイクファイルと、実際のアプリをコンパイルするためのサンプル MonoDevelop csproj の両方を更新する必要がありました。

  • Makefile
    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  
    

    メイクファイルを含むディレクトリには、ファイルredlaser.csenums.csおよびAssemblyInfo.cs(つまり、Chris のものと同じ) も含まれている必要があります。

  • MonoDevelop プロジェクトのビルド設定
    これが機能しなくなった理由は、MonoDevelop または MonoTouch のバグと、引用符が含まれている場合に「追加の mtouch 引数」を展開する方法にあると思います。Chris の元の議論は次のように見えました。

    -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」オプション全体を明示的に引用符で囲み、内側の引用符を手動でエスケープする必要があります。例えば:

    "-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\""
    

さて、コンパイルが完了したので、電話で実行しようとしました。アプリが正常に読み込まれ、関数を介して RedLaser SDK が正常に呼び出されRedLaserSDK.CheckReadyStatus()ます。しかし、スキャン ボタン (を読み込む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と、カメラ ビューをロードして表示できます。明らかに、バーコードを検出することはありません。

4

2 に答える 2

3

あなたが言及したクラッシュは、現在バインディングで修正されています

これは、QR の C++ 例外の使用と不適切なリンク引数に関連していました。

于 2013-02-18T15:12:05.447 に答える
2

貼り付けた Makefile によると、この RedLaser バインディングは、MonoTouch でサポートされている LinkWith[1] 機能を使用して、「追加の mtouch 引数」を使用する必要をなくしています。

Project Options の追加の mtouch 引数構成から RedLaser に必要な引数をすべて消去するだけで、ビルドと動作が適切に行われる可能性があります。

そうでない場合は、最新の可能性があるhttps://github.com/xamarin/monotouch-bindingsの RedLaser バインディングを使用してみてください。

ノート:

  1. http://blog.xamarin.com/2011/11/02/monotouch-native-libraries-made-easy/
于 2012-04-06T15:14:28.723 に答える