API C++ с обратными вызовами для Objective-C++
Я пытаюсь обернуть библиотеку с ++ с целью-с ++, чтобы я мог использовать ее в приложении для iOS. Библиотека не закончена, только спецификации и черновик файла заголовка, который я буду использовать.
API имеет функциюResult initialize(const char* oemUser, const char* oemPassword, Callback* pCallback);
где pCallback будет вызываться с разными состояниями и прогрессом.Callback
это чистый virtual Class
,
Я следовал некоторым инструкциям, чтобы обернуть код, и я думаю, что понимаю, как правильно обернуть его, чтобы я мог вызвать C++
функции от Objective-C++
но не наоборот.
Некоторый код:
foo.hpp (c++ api-headers)
#ifndef FOO_API_H
#define FOO_API_H
namespace foo {
namespace bar {
enum struct Result
{
Ok,
Error,
};
enum struct State
{
Uninitialized,
Done,
kError,
};
class Callback
{
public:
virtual ~Callback() {}
virtual Result enumerateEndpoints(int index,
char* info,
unsigned length) const = 0;
virtual Result processState(State state,
float progress,
bool reqNext) = 0;
};
/** Initialize - initializes the FOO library
\param oemUser OEM user for validating library
\param oemPassword OEM password for validating library
\param pCallback Pointer to an object implementing Callback
interface
\return Result
*/
Result initialize(const char* oemUser,
const char* oemPassword,
Callback* pCallback);
Result terminate();
State getCurrentState();
Result getLastError(char* buffer, unsigned length);
}
}
#endif
FooApiControlWrapper.h (My main api wrapper i obj-c++)
#import <Foundation/Foundation.h>
#include "FooApiCallbackWrapper.h"
#include "foo_api.hpp"
@interface FooApiControlWrapper : NSObject
- (foo::bar::Result)initialize:(NSString*)oemUser with:(NSString*)oemPassword using:(foo::bar::Callback*)callback;
- (foo::bar::Result)terminate;
- (foo::bar::State)getCurrentState;
- (foo::bar::Result)getLastError:(NSString*)buffer lengt:(NSInteger*)length;
@end
FooApiControlWrapper.mm
Здесь вы можете видеть, что я предоставляю foo::bar::Callback
к параметру init obj-C++, но почему-то я думаю, что это должно быть Obj-c++ Object
,
#import "FooApiControlWrapper.h"
#include "foo_api.hpp"
@implementation FooApiControlWrapper
- (foo::bar::Result)initialize:(NSString*)oemUser with:(NSString*)oemPassword using:(foo::bar::Callback*)callback {
return foo::bar::initialize([oemUser UTF8String], [oemPassword UTF8String], callback);
}
- (foo::bar::Result)terminate {
return foo::bar::Result::Ok;
}
- (foo::bar::State)getCurrentState {
return foo::bar::State::Uninitialized;
}
- (foo::bar::Result)getLastError:(NSString*)buffer lengt:(NSInteger*)length {
return foo::bar::Result::Ok;
}
@end
FooApiCallbackWrapper.h (My wrapper for the callback class)
#import <Foundation/Foundation.h>
#include "foo_api.hpp"
@interface FooApiCallbackWrapper : NSObject
- (instancetype) init;
- (foo::bar::Result)enumerateEndpoints:(NSInteger*)index with:(NSString*)info and:(NSInteger*)length;
- (foo::bar::Result)processState:(foo::bar::State)state progress:(float)progress reqNext:(Boolean)reqNext;
@end
FooApiCallbackWrapper.mm
#import "FooApiCallbackWrapper.h"
#include "foo_api.hpp"
@implementation FooApiCallbackWrapper
- (instancetype) init{
self = [super init];
return self;
}
- (void)dealloc{
}
- (foo::bar::Result)enumerateEndpoints:(NSInteger*)index with:(NSString*)info and:(NSInteger*)length {
return foo::bar::Result::Ok;
}
- (foo::bar::Result)processState:(foo::bar::State)state progress:(float)progress reqNext:(Boolean)reqNext {
return foo::bar::Result::Ok;
}
@end
Я просто хочу иметь возможность написать обратный вызов в Obj-C++, который позже будет вызываться моим C++-Api. Где и как действовать?
1 ответ
Помните, что C++ разрешен в Objective-C++, поэтому стандартным способом является просто добавить простую функцию C или C++ в вашу часть Objective-C++ (вне библиотеки), и позволить этой функции - которая компилируется как Objective-C++, работать с вещами Obj-C++, т.е. выполнять методы в Obj-C++ - Objects. Если вам нужно передать References to Objects, обычно подойдет void *. В качестве альтернативы, может быть использован какой-то одноэлементный / поисковый шаблон.