2010-11-23 10 views
4

liaison ObjectiveC classe C# problèmeReliure ObjectiveC classe C# problème

Le projet MonoTouch décrit comment lier les types ObjectiveC pour une utilisation avec MonoTouch. Nous avons omis de le faire pour la bibliothèque AdMob (voir aussi le monotouch-binding-for-admob blog at sabonrai dot wordpress dot com

Nous avons donc décidé de créer le plus petit projet de test possible: nous avons écrit une classe objc simple avec deux méthodes simples, une qui retourne une chaîne et une qui retourne un entier

Voici le TstLib.h.

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

et le fichier 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 

Nous avons un peu Projet de console objc pour valider cette bibliothèque. Voici le code:

#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); 
} 

Donc, définissons un fichier de liaison pour l'utilitaire btouch.

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

Nous créons alors un libTstLib.a et un fichier TstLib.dll avec l'utilitaire btouch:

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

Nous créons maintenant une nouvelle application iphone basée fenêtre MonoTouch 'APITEST', ajoute un répertoire Lib avec le libTstLib.a et les fichiers TstLib.dll, ajoutez une référence à cette TstLib.dll et d'intégrer notre TstLib dans les 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) 
    { 
    } 
    } 
} 

ce petit projet se déroule sans que les deux déclarations Console.Writeline . Il se bloque sans aucune sortie dès qu'une des instructions Console.WriteLine est exécutée.

Nous avons essayé d'être aussi concis que possible, en fournissant toujours assez d'informations pour recréer le cas de test. Nous sommes très disposés à fournir toute information supplémentaire pour aider à résoudre ce problème.

Est-ce que quelqu'un voit pourquoi cela ne fonctionne pas comme prévu? Nous nous sommes limités au strict minimum pour tester si nous pouvons fournir et utiliser une liaison pour une classe ObjC minimale.

Malheureusement, cela échoue. Et il échoue de la même manière que le projet MT_SampleAdMob décrit dans le blog monotouch-binding-for-admob. Notre petit projet utilise l'approche btouch décrite dans monotouch dot net sous la rubrique Binding_New_Objective-C_Types alors que le projet MT_SampleAdMob utilise l'approche «manuelle» décrite au même endroit.

Les deux approches échouent dans une matière similaire. Dès qu'une méthode de classe ou d'instance est appelée, l'application se bloque simplement sans aucune sortie.

Nous n'avons aucune idée de ce qui peut être fait pour identifier ce problème et arriver à une solution. Monotouch fournit des liaisons C# pour de nombreuses classes ObjC, donc cela doit être possible. Nous avons soigneusement étudié les documents MonoTouch référencés ci-dessus. Nous ne voyons pas où le MT_SampleAdMob ou cette approche btouch dévierait de la procédure prescrite, et pourtant les deux échouent!

Alors vraiment, nous avons désespérément besoin d'aide ici ...

Répondre

6

Vous n'avez probablement pas désactivé le mode THUMB pour votre bibliothèque native. Depuis iOS SDK 3.0, l'éditeur de liens Apple a des problèmes pour lier les bibliothèques Thumb à des projets plus importants.

Vous pouvez désactiver le mode de pouce en ouvrant votre bibliothèque native dans Xcode et de faire ce qui suit:

  1. Projet -> Modifier les paramètres du projet
  2. type "pouce" dans "Rechercher dans Build Settings"
  3. Décochez la case
  4. Reconstruisez votre bibliothèque native.
+0

Geoff, Bien sûr, vous aviez raison. J'ai oublié la chose du pouce. J'avais vu des articles mentionner cet aspect, mais je n'ai jamais vu une explication claire et concise à ce sujet. Après l'avoir appliqué à ma petite bibliothèque de test, le test de l'iPhone a réussi. Je vais maintenant essayer de travailler sur la bibliothèque AdMob et je publierai mes résultats ici. Merci pour votre aide, Mollyke. – guivho

+0

voir http://stackoverflow.com/questions/4271126/monotouch-binding-for-touchjson – guivho