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.
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