У меня есть приложение monotouch, которое включает в себя статическую библиотеку цели-c. Приложение работает правильно на симуляторе, но когда я пытаюсь запустить приложение на своем iPhone 3GS, он падает при запуске. Это те шаги, которые я взял, чтобы попытаться получить его работу:Приложение со статической библиотекой работает на симуляторе, но не на самом устройстве
- Составителя статической библиотеки в Xcode с устройства указанного и активной архитектурой набора на ARMv6 и в ARMv7 (я не уверен, что правильно , но я попробовал и то, и другое не работал).
- Под информацией о проекте я установил код подписи с идентификатором на мой ключ разработчика.
В MonoDevelop я включил статическую библиотеку в настройках проекта приложения, установив дополнительные аргументы MonoTouch под iPhone построить иметь следующее значение (это идентично тому, что устанавливается для iPhoneSimulator):
-v -v -v -gcc_flags "-lstdC++ -I $ {ProjectDir}/Ultralite/Include -L $ {ProjectDir}/Ultralite -lUltralite -force_load $ {ProjectDir} /Ultralite/libUltralite.a"
Когда я пытаюсь запустить приложение, он падает при запуске (с o экран приложения даже не отображается). В MonoDevelop все, что я вижу следующее сообщение об исключении:
Exception of type 'Mono.Debugger.Soft.VMDisconnectedException' was thrown.
Все, что я вижу в журнале устройства в Xcode является следующее:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_PROTECTION_FAILURE at 0x2fd00f24
Если удалить -gcc_flags вариант из проекта , то приложение запускается, но с первой попытки пытается получить доступ к статической библиотеке. Таким образом, это определенно связано со статической библиотекой, которая приводит к сбою приложения при запуске.
Я понятия не имею, где даже начать с решения этого, и поэтому действительно нужна помощь в этом. Кто-нибудь получил какие-либо идеи относительно того, что не так со статической библиотекой, в которую я включаю, или знаю, где я могу получить больше информации о том, что происходит не так? Сообщение KERN_PROTECTION_FAILURE в отчете о сбое действительно не дает мне много работы.
Update: Я создал простое приложение Hello World, который имеет одну кнопку, которая при нажатии вызывает метод SayHello в статической библиотеке. Даже в этом базовом примере я столкнулся с той же проблемой; а именно, что он работает на симуляторе, но не на самом устройстве. Я загрузил свой пример helloworld в github. Я был бы очень признателен, если бы кто-то помог мне в этом. Вот пример Hello World:
https://github.com/BruceHill/HelloWorld
Это включает в себя папку для основного приложения, папки с Objective-C статическую библиотеку, а затем, наконец, папку для btouch определения. Я вызываю btouch с параметром -outdir =. для построения Messaging.g.cs и UltraliteManager.g.cs, которые затем включаю в приложение MonoTouch.
Выписка из отчета о ДТП: Thread 0 Имя: очереди отправки: com.apple.main-нить Thread 0 Разбился: 0 Mobileforms \t 0x00fc0c1c mono_aot_get_class_from_name (АОТ-runtime.c: 1497) 1 Mobileforms \t 0x010225b0 mono_class_from_name (class.c: 7092) 2 Mobileforms \t 0x0103ce80 mono_exception_from_name_domain (exception.c: 58) 3 Mobileforms \t 0x0103ce38 mono_exception_from_name (exception.c: 35) 4 Mobileforms \t 0x0103d418 mono_get_exception_null_reference (exception.c: 280) – BruceHill
Я теперь шаг ближе к решению этой проблемы. Мне удалось получить образец _Hello World_, изменив параметр _Linker behavior_ в настройках сборки из _Don't link_ в _Link SDK assemblysies only_. Однако, когда я делаю это изменение в реальном приложении, я получаю сообщение об ошибке «mtouch failed with no output», и в журнале сборки я вижу ошибки компоновщика, в которых указано, что символы не определены. Например, в нем указано, что «_SecRandomCopyBytes» и «_SecKeyGetBlockSize» в libUltralite.a не определены. – BruceHill