Использование RedLaser SDK через MonoTouch аварийно завершает работу, как только отображается BarcodePickerController
Я использую привязки RedLaser MonoTouch Криса Брэнсона и пример отсюда: https://github.com/chrisbranson/RedLaserSample
Во-первых, чтобы помочь тем, у кого также есть проблемы с этим примером проекта, мне пришлось обновить как make-файл для сборки привязок RedLaser.dll MonoTouch, так и образец MonoDevelop csproj, чтобы получить фактическую компиляцию приложения.
Makefile
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
Каталог, содержащий make-файл, должен также содержать файлы
redlaser.cs
,enums.cs
а такжеAssemblyInfo.cs
(т.е. такой же, как у Криса).Настройки сборки проекта 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', вручную экранируя внутренние кавычки. например:
"-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, все цель-c) работает нормально.
Кроме того, если это имеет какое-либо значение, отключение всех типов сканирования штрих-кода позволяет BarcodePickerController
загрузить и отобразить вид с камеры. Очевидно, он никогда не обнаруживает штрих-код.
2 ответа
Вышеупомянутая авария была исправлена в привязках.
Это было связано с использованием QR исключений C++ и неправильными аргументами связывания.
Согласно вставленному вами Makefile, эта привязка RedLaser использует функцию LinkWith[1], поддерживаемую MonoTouch, чтобы исключить необходимость использования любых "дополнительных аргументов mtouch".
Просто удалите все аргументы, необходимые для RedLaser, из конфигурации ваших дополнительных аргументов mtouch в опциях проекта, и все, скорее всего, будет работать и работать правильно.
Если нет, попробуйте использовать привязку RedLaser с https://github.com/xamarin/monotouch-bindings которая может быть более актуальной?
Заметки: