C++ から Objective-C の処理を呼ぶ方法

できるだけ簡単かつファイルを分割せず C++ から Objective-C の処理を呼び出したい場合、以下のように実装できます。この方法は Cocos2d-x でも有効です。

構成

SubView.h (呼ばれる側のヘッダファイル)
// C++ から呼ばれるクラスを宣言する
class SubView
{
    public:
        // C++ から呼ばれる関数
        static void callObjC();
};

SubView.mm (呼ばれる側のソースファイル)
#import "SubView.h"

// ヘッダファイルではなく、ソースファイルで Objective-C クラスを宣言する
@interface ClassObjC : NSObject

+ (void)testingMethod;

@end

// 通常通りソースファイルで Objective-C クラスを実装する
@implementation ClassObjC

//--------------------------------------------------
// [Objective-C] テスト用
//--------------------------------------------------
+ (void)testingMethod
{
    NSLog(@"C++ から呼ばれました。");
}

@end

//==================================================
// [C++] Objective-C クラスのメソッドを呼ぶ
//==================================================
void SubView::callObjC()
{
    [ClassObjC testingMethod];
}

MainView.cpp (呼ぶ側)
#include "SubView.h"

void MainView::mainFunc()
{
    SubView::callObjC();
}

要説

Objective-C ファイルに C++ 用の入り口を付けるイメージです。
処理順はこのようになります。
  1. MainView::mainFunc()
  2. SubView::callObjC()
  3. [ClassObjC testingMethod]
例えば元々 Objective-C ファイルがある場合、クラスの宣言をソースファイルに移し、呼び出し用の C++ コードを付け足すだけで要件を満たせます。 ただし、そのソースファイルは C++ と Objective-C を含むので、拡張子を .mm にする必要があります。