cocos2d-xを使ってオリジナルアプリを作ってみます。
実装するアプリは「簡単なパズルゲーム」にする予定です。

環境

  • Windows 10
  • cocos2d-x 3.5
  • Android NDK r10d

ディレクトリ構造

本開発ではClasses以下のファイルが増えていきますので、次のような構造にし、ファイル整理把握を容易にします。
1ディレクトリ配置するファイル数は、目安として 7つ 程度がベターだと思います。

  |- Classes
  |    |- Component  // コンポーネントクラスを格納します
  |    |- Scene      // シーン用のクラスを格納します
  |      |- GameScene.cpp
  |- AppDelegate.cpp

Android.mkの修正

Android版アプリの開発では C++ファイルを追加するたびに、jni/Android.mkも修正 しなければなりません。
しかしながら、このような人力の作業は必ずミスを招きますので、可能な限り自動化しましょう。というか、単純に面倒ですよね!

Android.mkを次のように修正します。

before

LOCAL_SRC_FILES := hellocpp/main.cpp
   ../../Classes/AppDelegate.cpp
   ../../Classes/TitleScene.cpp
   ../../Classes/GameScene.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

after

ifeq ($(HOST_OS),windows)
    CPP_FILES := $(shell dir "$(LOCAL_PATH)/../../Classes/" /b /s /a-d | find ".cpp")
else
    CPP_FILES := $(shell find $(LOCAL_PATH)/../../Classes -name *.cpp)
endif
LOCAL_SRC_FILES := hellocpp/main.cpp
LOCAL_SRC_FILES += $(CPP_FILES:$(LOCAL_PATH)/%=%)

ifeq ($(HOST_OS),windows)
    LOCAL_DIRS := $(shell dir "$(LOCAL_PATH)/../../Classes" /b /s /ad)
else
    LOCAL_DIRS := $(shell find $(LOCAL_PATH)/../../Classes -type d)
endif
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_C_INCLUDES += $(LOCAL_DIRS:$(LOCAL_PATH)/%=%)

LOCAL_SRC_FILESはcppを読み込むための処理。LOCAL_C_INCLUDESはヘッダファイルを検索するための処理です。

shell findする対処方法はよく見かけますが、これは Mac or Linuxを利用していることが前提 になっているようですね。Windowsのfindコマンドは目的が異なりますので、findするサンプルをそのままでは利用できません。
そこで、$(HOST_OS)を判定して条件分岐を行います。

自動化しないことのデメリット

Android.mkの修正漏れはビルドエラー につながってしまいます。
大規模開発だとファイル数が何百にも及びますから、ファイル読み込みもれの調査がどれだけのロスにつながるか。それは恐ろしく効率が悪く、しかも生産性が皆無な作業です。

iOSはそもそもがファイルを自動で検出してくれます。
このように低いレベルで対処されることが理想ですね。


2015年08月18日:Android.mkの記述が誤っておりガッツリ修正しました。しっかり検証せず申し訳ありません。