2016-04-01 9 views
1

私はobjective-C++でC++ライブラリをラップしようとしていますので、iOSアプリケーションで使用できます。ライブラリは、私が使用するヘッダーファイルの仕様とドラフトのみが完成していません。objective-C++へのコールバック付きのC++ API

API関数pCallbackが異なる状態と進行に呼び出されます Result initialize(const char* oemUser, const char* oemPassword, Callback* pCallback);

を持っています。 Callbackは、純粋なvirtual Classです。

私は、コードをラップするために、いくつかのガイドを次されている、と私は私が他の方法で回避Objective-C++から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

あなたは私がobj-C++のinitパラメータにfoo::bar::Callbackを提供していますことを確認することができ、どういうわけか私はこれがObj-c++ Objectであるべきだと思います。アピ -

#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 

私はちょうど後で私のC++で呼び出されるのObj-C++でのコールバックを書くことができるようにしたい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 

FooApiCallbackWrapper.h (My wrapper for the callback class)

#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 

。 どこへ進んでいきますか?

答えて

1

Objective-C++ではC++が許可されていることを覚えておいてください。標準的な方法はObjective-C++の部分(ライブラリの外)にプレーンCまたはC++関数を追加し、 Objective-C++は、Obj-C++のもので動作します。つまり、Obj-C++オブジェクトのメソッドを実行します。オブジェクトへの参照を渡す必要がある場合、通常はvoid *が実行されます。あるいは、シングルトン/ルックアップパターンを使用することもできます。

+0

ええとfoo :: bar :: Callbackのサブクラスを作成し、callbackWrapperにその参照を保存しました。私は今これを管理していると思う。今私はブリッジヘッダーファイルにラッパーヘッダーファイルを追加した後にのみ発生するリンカーの問題に苦しんでいます。 – Furedal

関連する問題