sqliteを使用したcocos2dxのAndroid用コンパイル

ChainZ(クリエイター)
いろいろやってます。

cocos2dxでsqlite3の使い方はraharu(仮名)さんの「Cocos2dx Sqlite3を使ってみる」という記事で紹介された。その記事に沿ってiOSのコンパイルは無事にできると思うが、Android用にコンパイルする時は、ちょっとした調節が必要になる。

##sqlite3取得

まずsqlite3のソースコードを取得しましょう。公式サイトのダウンロードページへ移動する:http://www.sqlite.org/download.html

sqlite3 download

ダウンロードしたファイルを解凍したら、下記のファイルがある。

sqlite3 files

中のshell.cというファイルは使わないので、削除してもオッケー。 コードをきれいにまとめたいので、先ほどダウンロードしたsqliteのソースファイルをsqliteというフォルダに入れて、cocos2dxプロジェクトのClassesフォルダに置く。

sqlite3 folder

sqlite3を用意し終わったら、xcodeのほうへ移動しよう。

xcode

用意したsqliteのソースコードをプロジェクトに追加する。

xcode add sqlite3

3のところのチェック必ず外してください。なぜかというと、xcodeはもともとsqliteのライブラリが入っているので、ファイルをコピーすると、コンフリクトになってxcodeに怒られる。

xcode attention

注意:sqliteを使う時に、ダブルクォーテーションでincludeしてください。じゃなかったら、xcodeが自分のsqliteライブラリを使ってしまうので、Androidのコンパイルにはエラーが出る。

#include "sqlite/sqlite.h"	<= OK!
#include <sqlite.h>			<= NG

コンパイルの準備

cocos2dxはAndroidのNDKを利用してコンパイルを行うので、コンパイラにどのファイルをコンパイルするかを教えなければならない。cocos2dxプロジェクトフォルダのproj.androidを開いてみると、下記の構造になってる:

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++への移行は結構しんどい!