sqliteを使用したcocos2dxのAndroid用コンパイル
cocos2dxでsqlite3の使い方はraharu(仮名)さんの「Cocos2dx Sqlite3を使ってみる」という記事で紹介された。その記事に沿ってiOSのコンパイルは無事にできると思うが、Android用にコンパイルする時は、ちょっとした調節が必要になる。
##sqlite3取得
まずsqlite3のソースコードを取得しましょう。公式サイトのダウンロードページへ移動する:http://www.sqlite.org/download.html
ダウンロードしたファイルを解凍したら、下記のファイルがある。
中のshell.c
というファイルは使わないので、削除してもオッケー。
コードをきれいにまとめたいので、先ほどダウンロードしたsqliteのソースファイルをsqlite
というフォルダに入れて、cocos2dxプロジェクトのClasses
フォルダに置く。
sqlite3を用意し終わったら、xcodeのほうへ移動しよう。
xcode
用意したsqliteのソースコードをプロジェクトに追加する。
3のところのチェック必ず外してください。なぜかというと、xcodeはもともとsqliteのライブラリが入っているので、ファイルをコピーすると、コンフリクトになってxcodeに怒られる。
注意:sqliteを使う時に、ダブルクォーテーションでinclude
してください。じゃなかったら、xcodeが自分のsqliteライブラリを使ってしまうので、Androidのコンパイルにはエラーが出る。
#include "sqlite/sqlite.h" <= OK!
#include <sqlite.h> <= NG
コンパイルの準備
cocos2dxはAndroidのNDKを利用してコンパイルを行うので、コンパイラにどのファイルをコンパイルするかを教えなければならない。cocos2dxプロジェクトフォルダのproj.android
を開いてみると、下記の構造になってる:
jni
の中にAndroid.mk
というファイルがある。これはAndroidのコンパイル設定ファイル、中を開いてみたら、下記のコードが書かれてる。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cocos2dcpp_shared
LOCAL_MODULE_FILENAME := libcocos2dcpp
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
include $(BUILD_SHARED_LIBRARY)
$(call import-module,2d)
$(call import-module,audio/android)
$(call import-module,Box2D)
中にLOCAL_SRC_FILES
という項目がある。これは「次に書いたソースファイルをコンパイルしてね」というコンパイラへのメッセージなのだ。なので、先ほどClasses
フォルダに入れたsqliteのソースファイルをここに追加すれば、コンパイルされる。
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp \
../../Classes/sqlite/sqlite.c
たぶんこの時点でもうわかると思うが、cocos2dxで使うすべてのファイルはAndroidにコンパイルする時に、ここに追加しなければならない。もちろん、ヘッダーファイルは入れなくてオッケー。
手順を沿ってやれば、proj.android
へ移動して下記のコマンドを叩くと
cocos compile -p android -j 2
無事にコンパイルされる、はず。
後記
cocos2dxプロジェクトをAndroidにコンパイルする時に結構不具合などが出る。Androidは基本的にJavaを使ってるので、C++のcocos2dxをAndroidにコンパイルする時に、NDKを使わなければならない。NDK自体はまだ完璧じゃないので、不具合などは避けられない。例えば、C++のto_string()
は使えなかったりする。解決法はto_string()
を自作するとか:
template <typename T>
std::string to_string(T value)
{
std::ostringstream os ;
os << value ;
return os.str() ;
}
PHPという勉強しやすい言語からC++への移行は結構しんどい!