2014年7月7日月曜日

cocos2d-xでユーザーの設定したNDK_MODULE_PATHを有効にする

cocos2d-x v3.1.1で作成したプロジェクトに、ユーザーの作成したスタティックライブラリをビルド&リンクする方法を調べました。

環境
  • cocos2d-x v3.1.1
  • Mac OS X 10.8.5
  • Android NDK r9d

おさらい:一般的なNDKプロジェクトの場合

通常のAndroid NDKプロジェクトのImport Module方式ですと、環境変数 NDK_MODULE_PATHに、モジュール群が格納されているパスを設定して、Android.mkの中で、以下のような感じでモジュールのビルドを行うことができました。
# Android.mkの一部

LOCAL_STATIC_LIBRARIES := oreore_mod

include $(BUILD_SHARED_LIBRARY)

$(call import-module,oreore_mod)


cocos2d-x v3.1.1プロジェクトの場合

cocos2d-x v3.1.1プロジェクトの場合は、NDK_MODULE_PATHを設定していても、ビルド中にモジュールを見つけられないというエラーが出てしまいます。
悩んだ挙句、build-cfg.jsonなるファイルを見つけました。
build-cfg.jsonファイルの中身
{
    "ndk_module_path" :[
        "../cocos2d",
        "../cocos2d/cocos",
        "../cocos2d/external"
    ],
    "copy_resources": [
        {
            "from": "../Resources",
            "to": ""
        }
    ]
}
ndk_module_pathという、まさに探し求めていた設定を見つけたと思って\(^o^)/したのですが、ここの設定を変えても、何も変化はありません。(汗)
build-cfg.jsonファイルは、古(いにしえ)の設定ファイルとなっているようです。(それともプロジェクトを新規生成する時の設定ファイルか何かなのでしょうか?)

気を取り直して、今度はビルドコマンドの build_native.py の中を読んでみますと、do_buildメソッドの中でNDK_MODULE_PATHを生成しているところが見つかりました。
ndk_module_path = 'NDK_MODULE_PATH=%s:%s/external:%s/cocos' % (cocos_root, cocos_root, cocos_root)
Pythonはあまり詳しくないのですが、これはどう見てもユーザーの設定したNDK_MODULE_PATHを取り込んでくれる余地がないことが分かります。

設定を見る限り、外部ライブラリ(モジュール)は、プロジェクト/cocos2d/external フォルダの中に入れるという事が標準となっているのかもしれません。

余談ですが、各プロジェクトフォルダの中に、外部ライブラリのソースファイルも入れて管理する方法は、cocos2d-iphoneでもお馴染みでした。個人的にはその方がプロジェクトソースのバージョン管理がしやすいので好きです。

ただ、cocos2d管理下のフォルダに、ユーザーの追加したライブラリを入れるのは嫌なので、自分で設定したフォルダを追加できるようにbuild_native.pyを変更してみました。

build_native.pyの変更

まず、新たにcheck_environment_ndk_module_path()というメソッドを追加します。
見よう見まねで書いてるので、間違っている所があったらすみません。
def check_environment_ndk_module_path():
    try:
        NDK_MODULE_PATH = os.environ['NDK_MODULE_PATH']
    except Exception:
        NDK_MODULE_PATH = ""

    return NDK_MODULE_PATH

do_build() メソッドの最初の方を、以下のように修正します。
文字列の連結部分に注意して下さい。
def do_build(cocos_root, ndk_root, app_android_root,ndk_build_param,sdk_root,android_platform,build_mode):

    ndk_path = os.path.join(ndk_root, "ndk-build")

    env_module_path = check_environment_ndk_module_path()
    ndk_module_path = "NDK_MODULE_PATH="+env_module_path

    # windows should use ";" to seperate module paths
    
    platform = sys.platform
    if platform == 'win32':
        if env_module_path!="":
            ndk_module_path += ";"
        ndk_module_path += '%s;%s/external;%s/cocos' % (cocos_root, cocos_root, cocos_root)
    else:
        if env_module_path!="":
            ndk_module_path += ":"
        ndk_module_path += '%s:%s/external:%s/cocos' % (cocos_root, cocos_root, cocos_root)

                        :
                        :

Eclipseのプロジェクトプロパティの設定追加

C/C++ Build > Environment にNDK_MODULE_PATHの定義を追加して、自分用のライブラリフォルダを指定します。
例えば、プロジェクトフォルダの直下に UserLibs とかいうフォルダを作って、そこに自分用のライブラリ(モジュール)を入れるのでしたら、UserLibsまでの絶対パスを指定します。
ndk_module_path.png

関連記事

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...