2016-05-09

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

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

構成

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

SubView.mm (呼ばれる側のソースファイル)
  1. #import "SubView.h"
  2.  
  3. // ヘッダファイルではなく、ソースファイルで Objective-C クラスを宣言する
  4. @interface ClassObjC : NSObject
  5.  
  6. + (void)testingMethod;
  7.  
  8. @end
  9.  
  10. // 通常通りソースファイルで Objective-C クラスを実装する
  11. @implementation ClassObjC
  12.  
  13. //--------------------------------------------------
  14. // [Objective-C] テスト用
  15. //--------------------------------------------------
  16. + (void)testingMethod
  17. {
  18. NSLog(@"C++ から呼ばれました。");
  19. }
  20.  
  21. @end
  22.  
  23. //==================================================
  24. // [C++] Objective-C クラスのメソッドを呼ぶ
  25. //==================================================
  26. void SubView::callObjC()
  27. {
  28. [ClassObjC testingMethod];
  29. }

MainView.cpp (呼ぶ側)
  1. #include "SubView.h"
  2.  
  3. void MainView::mainFunc()
  4. {
  5. SubView::callObjC();
  6. }

要説

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