我正在尝试将一个C++库包装在Objective-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++应用编程接口将按如下方式调用:
- (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++应用程序接口的好文章的建议或参考。
PS:我知道这个问题主要与C++和Objective-C有关,但我将MonoTouch作为一个标签包括在内,以防有使用btouch导入Objective-C类的经验的人有一些建议。
发布于 2011-09-12 18:34:40
我解决这个问题的方法是通过btouch改变暴露给Monotouch的API。具体地说,像OpenConnection i这样的方法只需要connectionParms,而不需要指向error类的指针。然后,我在open方法中进行了错误检查,如果出现错误,则返回nil。在包装器类中,我还保留了一个ULError对象,我将其命名为lastConnectionError,并且我的C++代码通过OpenConnection C++调用传递了一个指向该对象的指针。我在包装器类GetLastConnectionError中包含了一个单独的方法,它返回一个表示不同可能的错误状态的枚举。
发布于 2011-03-21 23:14:03
我认为最好的解决方案是围绕C++类创建一个objective-c类。那么使用btouch绑定应该是非常简单的。
https://stackoverflow.com/questions/5299138
复制相似问题