読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

Cocos2d-xからObjective-Cの処理を呼び出す

iOS Cocos2d-x

Cocos2d-xのC++からObjective-Cの処理を呼び出す方法です。

Objective-C++ってのがあるのでこっちは比較的簡単です。Androidは面倒ですが。

関連

環境

  • Cocos2d-x 3.2

Objective-Cの処理

テキトーにクラス作ります

Classes/platform/ios/objcっていうディレクトリを作ってその中にファイルを作りました。

クラスはNativeController_objcっていう名前でやりました。

NativeController_objc.h

#import <Foundation/Foundation.h>

@interface NativeController_objc : NSObject

+ (void)executeObjc;

@end

NativeController_objc.mm

ファイルの拡張子.mmにしました。今回はC++から呼び出すだけなので.mでも問題無いですが、ObjCからC++を呼びだたいときのことを考えて最初から.mmしておきます。

#import "NativeController_objc.h"

@implementation NativeController_objc

+ (void)executeObjc
{
    // なんか処理
}

@end

C++Objective-Cとの橋渡しするクラス

これが無くても直接Objective-C++を呼べばいいのですが、Androidでも共通して使いたいのでiOS/Androidの処理を橋渡しするクラスを作っておきます。

名前空間platformにしてあります。

NativeBridge.h

ヘッダーファイルはClasses/platform/NativeBridge.hに入れました。

#ifndef __NATIVE_CONTROLLER_H__
#define __NATIVE_CONTROLLER_H__

namespace platform
{

class NativeBridge
{
public:
    static void executeNative();
};

}

#endif //__NATIVE_CONTROLLER_H__

NativeBridge.mm

実装ファイルはClasses/platform/ios/NativeBridge.mmに入れました。

#import "NativeBridge.h"
#import "NativeController_objc.h"

namespace platform
{

void NativeBridge::executeNative()
{
    [NativeController_objc executeObjc];
}

}

ここで先ほど作ったNativeController_objcの処理を呼び出しています。

C++から呼び出す

あとはC++から呼び出すだけです。

#include "platform/NativeBridge.h"

...

platform::NativeBridge::executeNative();

ディレクトリ構成

出来上がったディレクトリ構成はこんな感じです。

Androidの対応も含めての構成です。

Classes
├── AppDelegate.cpp
├── AppDelegate.h
├── HelloWorldScene.cpp
├── HelloWorldScene.h
└── platform
    ├── NativeBridge.h
    ├── android
    │   ├── NativeBridge.cpp
    │   └── jni
    │       ├── NativeControllerJni.cpp
    │       ├── NativeControllerJni.h
    │       ├── org_cocos2dx_cpp_AppActivity.cpp
    │       └── org_cocos2dx_cpp_AppActivity.h
    └── ios
        ├── NativeBridge.mm
        └── objc
            ├── NativeController_objc.h
            └── NativeController_objc.mm