cocos2dxのAndroidでspineをビルドする

#cocos2dxのAndroid環境でspineを使用したい
cocos2dx v2.2.4で最新のspineを使いたい方向けの記事です。
記事にまとめる時間がほぼないので、ご指摘いただいた箇所の修正は、時間があるときに反映します。
個人の備忘録を共有しているという位置づけでみてもらえれば助かります。

##cocos2dx ver3.x系については...
cocos2d-xのversion3系についてはraharuさんのブログを参照してください。

http://raharu0425.hatenablog.com/entry/2014/05/22/182754




##Spineのランタイムを最新のものに更新する

Spineという便利なアニメーション作成ツールがあります。

http://ja.esotericsoftware.com/

これをcocos2dxで使用するとき、既存に組み込まれている古いspineのランタイムを最新版のものに更新する必要があります。

最新のランタイムはgithub上で公開されています。

https://github.com/EsotericSoftware/spine-runtimes/

cocos2d-xで動かすのに必要なランタイムは

* spine-c
* spine-cocos2dx

この2つです。

spine-cはinclude, srcフォルダ, spine-cocos2dxはsrcフォルダに収録されているc, cpp, hファイルをコピーします。

コピー先となるのは以下のパスになります。
このフォルダ以下は全更新する必要があるので、別名をつけて退避させておくと良いと思います！
(既存のspineフォルダには現在使われていないファイルやクラスがありますのでリネーム推奨！)

[cocos2dxルートフォルダ]/extensions/spine

spineフォルダをリネーム後、新規にspineフォルダを新規につくり先ほどのファイルを全てコピーします。


##Android.mkファイルの変更
ファイルを更新したためAndroid.mkフィアルを更新する必要があります。
spineフォルダ内にAndroid.mkファイルを作る方法もありますが、ここではextensionsフォルダにあるAndroid.mkファイルを変更しています。

変更後は以下のようになります。
差分ファイルで変更点を確認してください。

```cocos2dxルートフォルダ/extensions/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := cocos_extension_static

LOCAL_MODULE_FILENAME := libextension

LOCAL_SRC_FILES := AssetsManager/AssetsManager.cpp \
CCBReader/CCBFileLoader.cpp \
CCBReader/CCBReader.cpp \
CCBReader/CCControlButtonLoader.cpp \
CCBReader/CCControlLoader.cpp \
CCBReader/CCLabelBMFontLoader.cpp \
CCBReader/CCLabelTTFLoader.cpp \
CCBReader/CCLayerColorLoader.cpp \
CCBReader/CCLayerGradientLoader.cpp \
CCBReader/CCLayerLoader.cpp \
CCBReader/CCMenuItemImageLoader.cpp \
CCBReader/CCMenuItemLoader.cpp \
CCBReader/CCNodeLoader.cpp \
CCBReader/CCNodeLoaderLibrary.cpp \
CCBReader/CCParticleSystemQuadLoader.cpp \
CCBReader/CCScale9SpriteLoader.cpp \
CCBReader/CCScrollViewLoader.cpp \
CCBReader/CCSpriteLoader.cpp \
CCBReader/CCBAnimationManager.cpp \
CCBReader/CCBKeyframe.cpp \
CCBReader/CCBSequence.cpp \
CCBReader/CCBSequenceProperty.cpp \
CCBReader/CCBValue.cpp \
CCBReader/CCData.cpp \
CCBReader/CCNode+CCBRelativePositioning.cpp \
GUI/CCControlExtension/CCControl.cpp \
GUI/CCControlExtension/CCControlButton.cpp \
GUI/CCControlExtension/CCControlColourPicker.cpp \
GUI/CCControlExtension/CCControlHuePicker.cpp \
GUI/CCControlExtension/CCControlSaturationBrightnessPicker.cpp \
GUI/CCControlExtension/CCControlSlider.cpp \
GUI/CCControlExtension/CCControlSwitch.cpp \
GUI/CCControlExtension/CCControlUtils.cpp \
GUI/CCControlExtension/CCInvocation.cpp \
GUI/CCControlExtension/CCScale9Sprite.cpp \
GUI/CCControlExtension/CCControlPotentiometer.cpp \
GUI/CCControlExtension/CCControlStepper.cpp \
GUI/CCScrollView/CCScrollView.cpp \
GUI/CCScrollView/CCTableView.cpp \
GUI/CCScrollView/CCTableViewCell.cpp \
GUI/CCScrollView/CCSorting.cpp \
GUI/CCEditBox/CCEditBox.cpp \
GUI/CCEditBox/CCEditBoxImplAndroid.cpp \
network/HttpClient.cpp \
network/WebSocket.cpp \
physics_nodes/CCPhysicsDebugNode.cpp \
physics_nodes/CCPhysicsSprite.cpp \
LocalStorage/LocalStorageAndroid.cpp \
CocoStudio/Armature/CCArmature.cpp \
CocoStudio/Armature/CCBone.cpp \
CocoStudio/Armature/animation/CCArmatureAnimation.cpp \
CocoStudio/Armature/animation/CCProcessBase.cpp \
CocoStudio/Armature/animation/CCTween.cpp \
CocoStudio/Armature/datas/CCDatas.cpp \
CocoStudio/Armature/display/CCBatchNode.cpp \
CocoStudio/Armature/display/CCDecorativeDisplay.cpp \
CocoStudio/Armature/display/CCDisplayFactory.cpp \
CocoStudio/Armature/display/CCDisplayManager.cpp \
CocoStudio/Armature/display/CCSkin.cpp \
CocoStudio/Armature/physics/CCColliderDetector.cpp \
CocoStudio/Armature/utils/CCArmatureDefine.cpp \
CocoStudio/Armature/utils/CCArmatureDataManager.cpp \
CocoStudio/Armature/utils/CCDataReaderHelper.cpp \
CocoStudio/Armature/utils/CCSpriteFrameCacheHelper.cpp \
CocoStudio/Armature/utils/CCTransformHelp.cpp \
CocoStudio/Armature/utils/CCTweenFunction.cpp \
CocoStudio/Armature/utils/CCUtilMath.cpp \
CocoStudio/GUI/BaseClasses/UIWidget.cpp \
CocoStudio/GUI/Layouts/UILayout.cpp \
CocoStudio/GUI/Layouts/UILayoutParameter.cpp \
CocoStudio/GUI/Layouts/UILayoutDefine.cpp \
CocoStudio/GUI/System/CocosGUI.cpp \
CocoStudio/GUI/System/UIHelper.cpp \
CocoStudio/GUI/System/UITouchGroup.cpp \
CocoStudio/GUI/UIWidgets/ScrollWidget/UIListView.cpp \
CocoStudio/GUI/UIWidgets/ScrollWidget/UIPageView.cpp \
CocoStudio/GUI/UIWidgets/ScrollWidget/UIScrollView.cpp \
CocoStudio/GUI/UIWidgets/UIButton.cpp \
CocoStudio/GUI/UIWidgets/UICheckBox.cpp \
CocoStudio/GUI/UIWidgets/UIImageView.cpp \
CocoStudio/GUI/UIWidgets/UILabel.cpp \
CocoStudio/GUI/UIWidgets/UILabelAtlas.cpp \
CocoStudio/GUI/UIWidgets/UILabelBMFont.cpp \
CocoStudio/GUI/UIWidgets/UILoadingBar.cpp \
CocoStudio/GUI/UIWidgets/UISlider.cpp \
CocoStudio/GUI/UIWidgets/UITextField.cpp \
CocoStudio/GUI/UIWidgets/UIRichText.cpp \
CocoStudio/Components/CCComAttribute.cpp \
CocoStudio/Components/CCComAudio.cpp \
CocoStudio/Components/CCComController.cpp \
CocoStudio/Components/CCComRender.cpp \
CocoStudio/Components/CCInputDelegate.cpp \
CocoStudio/Json/DictionaryHelper.cpp \
CocoStudio/Json/CocoLoader.cpp \
CocoStudio/ActionTimeline/CCActionTimeline.cpp \
CocoStudio/ActionTimeline/CCActionTimelineCache.cpp \
CocoStudio/ActionTimeline/CCFrame.cpp \
CocoStudio/ActionTimeline/CCNodeReader.cpp \
CocoStudio/ActionTimeline/CCTimeline.cpp \
CocoStudio/Reader/SceneReader.cpp \
CocoStudio/Reader/GUIReader.cpp \
CocoStudio/Reader/WidgetReader/WidgetReader.cpp \
CocoStudio/Reader/WidgetReader/ButtonReader/ButtonReader.cpp \
CocoStudio/Reader/WidgetReader/CheckBoxReader/CheckBoxReader.cpp \
CocoStudio/Reader/WidgetReader/ImageViewReader/ImageViewReader.cpp \
CocoStudio/Reader/WidgetReader/LabelAtlasReader/LabelAtlasReader.cpp \
CocoStudio/Reader/WidgetReader/LabelBMFontReader/LabelBMFontReader.cpp \
CocoStudio/Reader/WidgetReader/LabelReader/LabelReader.cpp \
CocoStudio/Reader/WidgetReader/LayoutReader/LayoutReader.cpp \
CocoStudio/Reader/WidgetReader/ListViewReader/ListViewReader.cpp \
CocoStudio/Reader/WidgetReader/LoadingBarReader/LoadingBarReader.cpp \
CocoStudio/Reader/WidgetReader/PageViewReader/PageViewReader.cpp \
CocoStudio/Reader/WidgetReader/ScrollViewReader/ScrollViewReader.cpp \
CocoStudio/Reader/WidgetReader/SliderReader/SliderReader.cpp \
CocoStudio/Reader/WidgetReader/TextFieldReader/TextFieldReader.cpp \
CocoStudio/Action/CCActionManager.cpp \
CocoStudio/Action/CCActionObject.cpp \
CocoStudio/Action/CCActionNode.cpp \
CocoStudio/Action/CCActionFrame.cpp \
CocoStudio/Action/CCActionEaseEx.cpp \
CocoStudio/Action/CCActionFrameEasing.cpp \
CocoStudio/Trigger/ObjectFactory.cpp \
CocoStudio/Trigger/TriggerBase.cpp \
CocoStudio/Trigger/TriggerMng.cpp \
CocoStudio/Trigger/TriggerObj.cpp

# 古いspineファイルの取り込みを削除して
# 以下の2行を追加しています
LOCAL_SRC_FILES += $(shell find $(LOCAL_PATH)/spine -name "*.c")
LOCAL_SRC_FILES += $(shell find $(LOCAL_PATH)/spine -name "*.cpp")


LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_curl_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static
LOCAL_WHOLE_STATIC_LIBRARIES += libwebsockets_static

LOCAL_CFLAGS += -DCC_ENABLE_CHIPMUNK_INTEGRATION=1
LOCAL_EXPORT_CFLAGS += -DCC_ENABLE_CHIPMUNK_INTEGRATION=1
LOCAL_CPPFLAGS += -DCC_ENABLE_CHIPMUNK_INTEGRATION=1
LOCAL_EXPORT_CPPFLAGS += -DCC_ENABLE_CHIPMUNK_INTEGRATION=1

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) \
                           $(LOCAL_PATH)/CCBReader \
                           $(LOCAL_PATH)/GUI/CCControlExtension \
                           $(LOCAL_PATH)/GUI/CCScrollView \
                           $(LOCAL_PATH)/network \
                           $(LOCAL_PATH)/LocalStorage \
                           $(LOCAL_PATH)/CocoStudio/Armature \
                           $(LOCAL_PATH)/spine
# 上の1行を追加しています。
# また追加した行の上にも変更があります。注意してください。

LOCAL_CFLAGS := -fexceptions

include $(BUILD_STATIC_LIBRARY)

$(call import-module,cocos2dx)
$(call import-module,CocosDenshion/android)
$(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)
$(call import-module,external/Box2D)
$(call import-module,external/chipmunk)
$(call import-module,external/libwebsockets/android)

```

やっていることは...

* コピーした最新のランタイムをビルド対象にする
* spineのhファイルを外部へ公開する

です。
(間違っていたら指摘ください！)

あとは通常のビルドでspineのランタイムがビルドされていればOK!!
最新のspineランタイムを使用することができます！

では〜楽しいcocos2dxライフを〜！