2016-04-01 13 views
1

Ich versuche, eine C++ - Bibliothek mit Objective-C++ zu wickeln, damit ich es in und iOS-Anwendung verwenden kann. Die Bibliothek ist nicht fertig, nur die Spezifikationen und ein Entwurf der Header-Datei, die ich verwenden werde.C++ api mit Callbacks zu objective-C++

Die api hat eine Funktion Result initialize(const char* oemUser, const char* oemPassword, Callback* pCallback);

wo pCallback mit verschiedenen Staaten und Fortschritt bezeichnet werden. Callback ist eine reine virtual Class.

Ich habe einige Anleitungen zum Umschließen des Codes verfolgt, und ich denke, ich verstehe, wie man es richtig einwickelt, so dass ich die C++ Funktionen von Objective-C++ aufrufen kann, aber nicht umgekehrt.

Einige Code:

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

Hier können Sie sehen, dass ich foo::bar::Callback auf die obj-C++ Init-Parameter am Bereitstellung, aber irgendwie denke ich, das sollte ein Obj-c++ Object sein.

#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 

Ich möchte nur in der Lage sein, einen Rückruf in Obj-C++ zu schreiben, die durch meine C genannt wird später ++ - Api. Wo und wie weiter?

Antwort

1

Erinnern Sie sich, dass C++ in Objective-C++ erlaubt ist, also ist der Standardweg, einfach eine einfache C- oder C++ - Funktion in Ihren Objective-C++ - Teil (außerhalb der Bibliothek) einzufügen und diese Funktion zu kompilieren Objective-C++, arbeite mit Obj-C++, dh führe Methoden für Obj-C++ - Objekte aus. Wenn Sie Verweise auf Objekte weitergeben müssen, wird in der Regel void * ausgeführt. Alternativ können einige Singleton/Look-Up-Muster verwendet werden.

+0

Ja, ich habe jetzt eine Unterklasse von foo :: bar :: Callback erstellt und einen Verweis darauf in meinem CallbackWrapper gespeichert. Ich denke, das mache ich jetzt. Im Moment habe ich Probleme mit Linkern, die erst nach dem Hinzufügen meiner Wrapper-Header-Dateien zu meiner Bridge-Header-Datei auftreten. – Furedal

Verwandte Themen