ここから 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.cs
、enums.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
と、カメラ ビューをロードして表示できます。明らかに、バーコードを検出することはありません。