我正在尝试用Objective-C类包装一个C++库,以便使用btouch导入到MonoTouch中。我正在努力理解如何将API翻译成可在托管环境中使用的形式。具体来说,如何处理那些需要传递指向本地变量指针的方法,例如以下示例中的ULDatabaseManager :: OpenConnection静态方法:
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);
}
从Objective-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。
PS:我知道这个问题主要涉及C++和Objective-C,但我将MonoTouch作为标签包括在内,以防有使用btouch导入Objective-C类的经验的人能提供一些建议。