2012-04-06 7 views
4
gezeigt

Absturz Ich bin mit Chris Branson RedLaser Monotouch Bindungen und Probe von hier: https://github.com/chrisbranson/RedLaserSampleMit RedLaser SDK über Monotouch, sobald BarcodePickerController

Erstens hatte diese auch Probleme mit diesem Beispielprojekt, um zu helfen, ich um sowohl das Makefile zu aktualisieren, um die RedLaser.dll MonoTouch-Bindungen zu erstellen, als auch das Beispiel MonoDevelop csproj, um die eigentliche App-Kompilierung zu erhalten.

  • Makefile
    Das Make-Datei von Chris geliefert dekomprimiert den Download RedLaser SDK, aber RedLaser ihre Namenskonvention geändert und es war so nicht mehr. Ich vereinfacht es, anstatt dass der Benutzer die libRedLaserSDK.a setzen in das Build-Verzeichnis-Datei manuell:

    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) [email protected] -e RedLaser.cs enums.cs AssemblyInfo.cs --link-with=$(BINDIR)libRedLaserSDK.a,libRedLaserSDK.a 
    
    clean: 
        -rm -rf $(BINDIR)*.dll 
    

    Das Verzeichnis der Make-Datei enthält auch die Dateien redlaser.cs, enums.cs und AssemblyInfo.cs (dh die gleiche wie Chris) enthalten sollte .

  • MonoDevelop Projekt Buildeinstellungen
    Ich denke, der Grund, warum dies funktioniert nicht mehr um einen Fehler in MonoDevelop oder Monotouch war und wie es die ‚Zusätzliche mTouch Argumente‘ erweitert, wenn sie Anführungszeichen enthalten. Chris ursprünglichen Argumente sah wie folgt aus:

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

    MonoDevelop analysieren dies nicht richtig, sondern das Einfügen Anführungszeichen um jede Option durch ein Leerzeichen getrennt. Suchen Sie in der Build-Ausgabe (unter ‚Kompilieren zu nativen Code‘) hat gezeigt, dass dies erweitert wurde:

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

    beinhaltet die Lösung explizite Anführungszeichen um die gesamte ‚gcc_flags‘ Option hinzugefügt, manuell die inneren Anführungszeichen zu entkommen. z:

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

    Dies erweitert richtig in:

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

Ok, also jetzt, dass ich es kompilieren hatte versuchte ich es auf meinem Handy zu laufen. Die App lädt gut und ruft erfolgreich das RedLaser SDK über die RedLaserSDK.CheckReadyStatus() Funktion auf. Aber sobald traf ich die Scan-Taste (die lädt die BarcodePickerController) stürzt mit einer nativen Ausnahme tief im 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. 
================================================================= 

Ausführen das sehr ähnlich RedLaser Xcode Beispielprojektes (dh keine Monotouch Beteiligung, alle Ziele -c) funktioniert gut.

Auch wenn es von Bedeutung ist, ermöglicht das Deaktivieren aller Barcode-Scan-Typen BarcodePickerController zu laden und die Kamera anzuzeigen. Natürlich erkennt es nie einen Barcode.

+0

Nur eine Idee, haben Sie versucht, ein MonoTouch-Bindungsprojekt anstelle von ihrem Makefile zu verwenden? Ich hatte immer mehr Glück, Objective-C-Bindungen auf diese Weise zu kompilieren (und Sie können es leicht in die Quellcodeverwaltung einfügen). – jonathanpeppers

Antwort

3

Der Absturz Sie hat erwähnen jetzt fixed in the bindings gewesen.

Es wurde mit der Verwendung von C++ - Ausnahmen und inkorrekten Verknüpfungsargumenten von QR in Verbindung gebracht.

+0

Danke! Ich benutze jetzt ZBar, aber ich war immer noch sehr neugierig, was das verursacht hat. Ich habe dein Commit überprüft und einen Link dazu in deine obige Antwort eingefügt, nur um zu sehen, was die Änderung war (und andere neugierig machen). Also, die 'NeedsGccExceptionHandling' Option, die Sie hinzugefügt haben, ist das für jede Bindung an eine Bibliothek erforderlich, die eine C++ Ausnahme von einem gebundenen Funktionsaufruf auslösen kann? Führt dies dazu, dass alle Funktionsbindungen in einen try-catch eingebunden werden und eine CIL-kompatible Ausnahme auslösen? – Tyson

+0

@Tyson: Eigentlich ist es das Gegenteil: Ich setze 'NeedsGccExceptionHandling' auf false. Dieser Wert lässt MonoTouch jetzt -lgcc_eh an den Linker übergeben, und das ist das eigentliche Problem (wir haben am Ende einige der doppelt geladenen Ausnahmebehandlungsfunktionen, insbesondere die Funktion, die Catch-Handler registriert - aber nicht die Funktionsverarbeitung Die throw-Anweisung Wenn die throw-Funktion nicht mit der catch-Funktion übereinstimmt, findet die throw-Funktion keine catch-Handler und bricht den Prozess ab. –

2

Gemäß dem eingefügten Makefile verwendet diese RedLaser-Bindung die LinkWith [1] -Funktion, die von MonoTouch unterstützt wird, um die Verwendung von "Zusätzliche mtouch-Argumente" zu vermeiden.

Löschen Sie einfach alle Argumente, die für RedLaser von Ihrer zusätzlichen mtouch Argumente Konfiguration in Ihren Projekt-Optionen benötigt werden und die Dinge werden wahrscheinlich & ordnungsgemäß funktionieren.

Wenn nicht, versuchen Sie, die RedLaser-Bindung von https://github.com/xamarin/monotouch-bindings zu verwenden, die aktueller sein kann?

Hinweise:

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

Haha "kann aktueller sein" - Von der GitHub-Seite: "RedLaser vor 39 Minuten [RedLaser] Hinzugefügt -unsafe zu btouch args, wie es jetzt benötigt wird. [Jstedfast]." Danke, ich überprüfe es jetzt. – Tyson

+0

Oh und das Entfernen aller 'zusätzlichen Mtouch-Argumente' funktioniert nicht, das habe ich schon probiert. – Tyson

+0

Ok, also habe ich die neueste RedLaser.dll-Bindung kompiliert, die mit dem Makefile im verknüpften GitHub-Repository kompiliert wurde. Keine Probleme. Ich habe es in die Wurzel des mitgelieferten Beispielprojekts kopiert, die 'zusätzlichen mtouch-Argumente' überprüft und bestätigt, dass sie nicht mehr benötigt werden (es ist leer). Alles bestens zusammengestellt. Nett! Geladen auf mein Telefon und rannte - auf die erste Seite, wo es die korrekte Eval-Version von RedLaserSDK zeigte, aber sobald ich Scan treffe, bekomme ich genau den gleichen SIGABRT-Absturz wie oben. Ich wechsle zu ZBar ... Ich werde meine Bindungen irgendwo hochladen, sobald ich fertig bin. – Tyson