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 *. В качестве альтернативы, может быть использован какой-то одноэлементный / поисковый шаблон.

Другие вопросы по тегам