2011-03-14 3 views
3

J'essaye d'emballer une bibliothèque C++ dans les classes Objective-C pour l'importer dans MonoTouch en utilisant btouch. J'essaie de comprendre comment traduire l'API pour l'utiliser dans un environnement géré. Plus précisément, la façon de traiter les méthodes qui prennent en pointeurs vers des variables locales, comme le ULDatabaseManager :: méthode statique OpenConnection dans l'exemple suivant:Traduction d'une API C++ dans une API de code managé

class UL_CLS_SPEC ULError { 
    public: 
    ULError(); 

    /* Gets the error code (SQLCODE) for the last operation. */ 
    inline an_sql_code GetSQLCode() const { 
     return _info.sqlcode; 
    } 
} 

class UL_CLS_SPEC ULDatabaseManager { 
    public: 
    /* Initializes the UltraLite runtime. */ 
    static bool Init(); 

    /* Finalizes the UltraLite runtime. */ 
    static void Fini(); 

    /* Opens a new connection to an existing database. */ 
    static ULConnection * OpenConnection(
     const char * connParms, 
     ULError * error = UL_NULL); 
} 

De Objective-C, cette API C++ serait appelé comme suit:

- (void)openConnection { 
    if (ULDatabaseManager::Init()) { 
     const char * connectionParms; 
     ULConnection * conn = nil; 
     ULError error; 

     connectionParms = [self getConnectionParms]; 

     // Attempt connection to the database 
     conn = ULDatabaseManager::OpenConnection(connectionParms, &error); 

     // If database file not found, create it and create the schema 
     if (error.GetSQLCode() == SQLE_ULTRALITE_DATABASE_NOT_FOUND) {  
      // Handle error 
     }     
    } 
} 

Dans cette API, l'appelant de la méthode statique OpenConnection est chargé de définir la variable ULError et de la transmettre en tant que paramètre de pointeur de référence. Ce paradigme ne semble pas bien se traduire dans un environnement géré, ou du moins pour moi, il ne semble pas correct que l'appelant soit responsable de l'instanciation de l'objet ULError. Quelle serait la meilleure pratique pour traduire cette API en classes Objective-C? Quelle classe serait responsable de la création et de la destruction de l'objet ULError?

J'espère que ma question a du sens, parce que je suis très nouveau en C++ et Objective-C (et MonoTouch d'ailleurs) donc je suis encore au point où je ne sais pas trop ce que je ne sais pas! :) Et se sentir un peu hors de ma profondeur ici pour le moment. J'apprécierais donc tout conseil ou référence à de bons articles qui vous aideront à expliquer comment encapsuler une API C++. PS: Je sais que cette question concerne principalement C++ et Objective-C, mais j'utilise MonoTouch comme balise dans le cas où quelqu'un qui a déjà utilisé btouch pour importer des classes Objective-C a quelques conseils à donner.

Répondre

0

La façon dont j'ai résolu cela est de changer l'API exposée à Monotouch avec btouch. Spécifiquement, des méthodes telles que OpenConnection J'ai seulement requis le connectionParms, pas le pointeur vers la classe d'erreur. J'ai alors fait la vérification d'erreur dans la méthode ouverte et ai retourné nul si une erreur s'est produite. Dans la classe wrapper j'ai aussi gardé un objet ULError que j'ai nommé lastConnectionError et mon code C++ a passé un pointeur vers cet objet avec l'appel C++ OpenConnection. J'ai inclus une méthode distincte dans ma classe wrapper, GetLastConnectionError, qui a renvoyé un enum représentant les différents états d'erreur possibles.

1

Je pense que votre meilleure solution sera de créer une classe objective-c autour de la classe C++. Ensuite, la liaison avec btouch devrait être très simple.

+0

C'est exactement la route que j'ai prise. J'emballe l'API C++ dans une bibliothèque objective-c, puis je lie avec btouch. J'ai une preuve de concept fonctionnant avec une partie de l'API C++. Je me suis surtout demandé, à propos de la conversion des méthodes qui renvoient des pointeurs vers des structures, comme la méthode statique _ULDatabaseManager :: OpenConnection_ dans l'exemple que j'ai donné. Quelle est la meilleure approche pour traduire des méthodes comme celle-ci? – BruceHill