将C++ API转换为托管代码API
我正在尝试在Objective-C类中包装C++库,以便使用btouch将其导入到MonoTouch中。我正试图掌握如何翻译API以在托管环境中使用。具体而言,如何处理在下面的示例中称取在指针的局部变量,像ULDatabaseManager方法:: OpenConnection的静态方法:将C++ API转换为托管代码API
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);
}
从客观-C,该C++ API将被称为如下:
- (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
}
}
}
在此API中,OpenConnection静态方法的调用者负责定义ULError变量并将其作为引用指针参数传入。这种范例似乎并不能很好地转化为托管环境,或者至少对我来说,让调用者负责实例化ULError对象似乎不太合适。将这个API翻译成Objective-C类的最佳做法是什么?哪个类将负责创建和销毁ULError对象?
我希望我的问题很有意义,因为我对C++和Objective-C(以及MonoTouch)非常陌生,所以我仍然不知道我不知道什么! :)此刻此刻我的感觉有点偏离我的深度。所以,我将不胜感激任何建议或引用优秀文章,这将有助于解释如何包装C++ API。我知道这个问题主要涉及到C++和Objective-C,但是我将MonoTouch作为标记来防止某人曾经有过使用btouch导入Objective-C类的经验,并提供了一些建议。
我解决这个问题的方法是用btouch更改暴露给Monotouch的API。具体来说,方法如OpenConnection我只需要connectionParms,而不是指向错误类的指针。然后,我在打开的方法中进行了错误检查,并在发生错误时返回无。在包装类中,我还保留了一个ULError对象,我将其命名为lastConnectionError并且我的C++代码传递了一个指向此对象的指针,其中包含OpenConnection C++调用。我在我的包装类中包含了一个单独的方法,GetLastConnectionError,返回枚举代表不同的可能的错误状态。
我认为你最好的解决方案是围绕C++类创建一个Objective-C类。然后用btouch绑定应该非常简单。
这正是我采取的路线。我将C++ API包装在一个Objective-C库中,然后用btouch绑定。我有一部分C++ API的概念验证。不过,我主要问的是转换返回结构指针的方法,比如我给出的例子中的_ULDatabaseManager :: OpenConnection_静态方法。翻译这种方法的最佳方法是什么? – BruceHill 2011-03-22 07:42:33