2010-11-23 6 views
4

Binding ObjectiveC класс для C проблемыСвязывание ObjectiveC класс для C# проблемы

Проект MonoTouch описывает, как связать ObjectiveC типов для использования с MonoTouch #. Мы не смогли сделать это для библиотеки AdMob (см. Также monotouch-binding-for-admob blog at sabonrai dot wordpress dot com.

Итак, мы решили создать наименьший возможный тестовый проект. Мы написали простой класс objc с двумя простыми методами, который возвращает строку, и тот, который возвращает целое число

Вот TstLib.h:.

#import <Cocoa/Cocoa.h> 
@interface TstCls : NSObject { 
} 
- (NSString *) Version; 
- (int) GimmeAnInt; 
@end 

и файл TstLib.m:

#import "TstCls.h" 
@implementation TstCls 
- (NSString *) Version { 
    return @"I ain't got a version, I'm a poor lonesome cowboy..."; 
} 
- (int) GimmeAnInt { 
    return 110646; 
} 
@end 

у нас есть немного objc для проверки этой библиотеки. Вот код:

#import <Cocoa/Cocoa.h> 
#import "../TstLib/TstCls.h" 
int main(int argc, char *argv[]) 
{ 
    TstCls* tstCls = [[TstCls alloc] init]; 
    NSLog(@"version = %@", [tstCls Version]); 
    NSLog(@"the int = %d", [tstCls GimmeAnInt]); 
    return NSApplicationMain(argc, (const char **) argv); 
} 

Итак, давайте определим файл привязки для утилиты btouch.

using MonoTouch.Foundation; 
namespace TstLib { 
    [BaseType (typeof (NSObject))] 
    interface TstCls { 
     [Export ("Version")] 
     string Version(); 
     [Export ("GimmeAnInt")] 
     int GimmeAnInt(); 
    } 
} 

Затем мы создаем libTstLib.a и TstLib.dll файл с btouch утилиты:

/Developer/MonoTouch/usr/bin/btouch -o TstLib.dll TstCls.cs 

Теперь мы создаем новый MonoTouch окна на основе iphone приложения 'ApiTest', добавить каталог Lib с libTstLib.a и файлами TstLib.dll, добавьте ссылку на эту TstLib.dll и интегрировать наш TstLib в Main.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using MonoTouch.Foundation; 
using MonoTouch.UIKit; 
using TstCls; 
namespace ApiTest 
{ 
    // -gcc_flags "-L${ProjectDir}/Lib -lTstLib -ObjC" 
    // or 
    // -gcc_flags "-L${ProjectDir}/Lib -lTstLib -force_load ${ProjectDir}/Lib/libTstLib.a" 
    public class Application 
    { 
    static void Main (string[] args) 
    { 
     UIApplication.Main (args); 
    } 
    } 
    // The name AppDelegate is referenced in the MainWindow.xib file. 
    public partial class AppDelegate : UIApplicationDelegate 
    { 
    // This method is invoked when the application has loaded its UI and its ready to run 
    public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
    { 
     // If you have defined a view, add it here: 
     // window.AddSubview (navigationController.View); 

     TstLib.TstCls tstCls = new TstLib.TstCls(); 
     Console.WriteLine ("TstLib.TstCls.Version() -> '{0}'", tstCls.Version()); 
     Console.WriteLine ("TstLib.TstCls.GimmeAnInt() -> '{0}'", tstCls.GimmeAnInt()); 
     window.MakeKeyAndVisible(); 
     return true; 
    } 
    // This method is required in iPhoneOS 3.0 
    public override void OnActivated (UIApplication application) 
    { 
    } 
    } 
} 

Этот маленький проект работает без два Console.WriteLine заявлений , Он вылетает без какого-либо вывода, как только выполняется один из операторов Console.WriteLine.

Мы старались быть как можно более краткими, предоставляя достаточно информации для воссоздания тестового примера. Мы очень хотим предоставить дополнительную информацию, чтобы помочь исправить это.

Кто-нибудь видит, почему это не работает должным образом? Мы ограничились минимальным минимумом, чтобы проверить, можем ли мы предоставить и использовать привязку для минимального класса ObjC.

К сожалению, это терпит неудачу. И он терпит неудачу так же, как проект MT_SampleAdMob, описанный в блоге monotouch-binding-for-admob.

Наш маленький проект использует подход btouch, описанный в netot dot net под заголовком Binding_New_Objective-C_Types, тогда как проект MT_SampleAdMob использует подход «вручную», описанный в том же месте.

Оба подхода терпят неудачу в аналогичном вопросе. Как только вызывается метод класса или экземпляра, приложение просто выходит из строя без вывода.

Мы понятия не имеем, что можно сделать, чтобы выявить эту проблему и прийти к решению. Monotouch предоставляет привязки C# для многих классов ObjC, поэтому это должно быть возможно. Мы внимательно изучили документы MonoTouch, упомянутые выше. Мы не видим, где либо MT_SampleAdMob, либо этот подход btouch отклонятся от предписанной процедуры, и все же оба терпят неудачу!

Итак, нам отчаянно нужна помощь здесь ...

ответ

6

Вероятно, вы не отключили режим THUMB для вашей родной библиотеки. С тех пор, как iOS SDK 3.0, у компоновщика яблока возникли проблемы с связыванием Thumb-библиотек в более крупные проекты.

Вы можете отключить режим большого пальца руки, открыв свою родную библиотеку в Xcode и делать следующее:

  1. Project -> Изменить настройки проекта
  2. типа «палец» в «Поиске в Постройте Настройки»
  3. Снимите флажок
  4. Восстановите свою родную библиотеку.
+0

Geoff, Конечно, вы были правы. Я забыл про большой предмет. Я видел публикации, упоминающие этот аспект, но никогда не видел ясного краткого объяснения по этому поводу. После применения этого в моей маленькой тестовой библиотеке тест iPhone прошел успешно. Итак, теперь я попытаюсь это сделать для библиотеки AdMob, и я опубликую свои результаты здесь. Спасибо за вашу помощь, Mollyke. – guivho 2010-11-24 08:41:59