assetsファイル読み込み
2013-11-04


三角ポリゴンの描画ができたので、次はテクスチャの描画に移ります。
テクスチャのデータは assetsフォルダに置いておきます。res/rawに置くという手もありますが、assetsの方がいろいろ融通がききそうなので。
ただ、assetsフォルダからの読み込みにもいくつか手順がありますので、今回はその辺りをやってみます。

assetsの読み込みには幾通りかのやり方があるようなのですが、Android OS 2.3以降で使える AssetManagerを使う方法にしてみます。

BaseActivity.java
                public void     onSurfaceChanged(GL10 gl, int width, int height)
                {
                        int             period = initNative(width, height, getAssets());                        // native部初期化

                        if ( future == null ) {                                                 // 定期実行開始
                                future = executor.scheduleAtFixedRate(new Runnable()
                                {
                                        @Override
                                        public void     run()
                                        {
                                                surface_view.requestRender();           // 描画リクエスト
                                        }
                                },
                                0, period, TimeUnit.MILLISECONDS);
                        }
                }

AssetManagerは java側で取得できるので、initNativeで native側に送ります。

SysMain.cpp
        asset_manager = AAssetManager_fromJava(env, mgr);               // asset読み込みマネージャー
        assert(asset_manager != NULL);

それを native側で受け取って、AAssetManagerに変換します。

namespace sys
{

AAssetManager*  asset_manager;                  // asset読み込み用

/****************************************
    assetファイル読み込み
                        引数      name = ファイル名
                        戻り値     データ
                                        size:データサイズ
 ****************************************/
void*   load_asset(const char* name, u32* size)
{
        AAsset* _asset = AAssetManager_open(asset_manager, name, AASSET_MODE_BUFFER);

        assert(_asset);

        size_t  _size = AAsset_getLength(_asset);               // ファイルサイズ
        void*   _buf = malloc(_size);                                   // データバッファ

        AAsset_read(_asset, _buf, _size);                               // データ読み込み
        AAsset_close(_asset);
        if ( size ) {
                *size = (u32)_size;
        }
        return  _buf;
}

}

ファイル読み込み用の関数です。
データバッファを mallocで取っているので、使い終わったら freeで解放してください。

ファイル読み込みのサンプルです。
assetsフォルダには、test.txtというテキスト(終端に'\0'を追加)を置いておきます。

AppMain.cpp
/************
    初期化
 ************/
void    init_app(void)
{
        u32             _size;
        char*   _str = (char*)sys::load_asset("test.txt", &amp_size);           // テスト文字列

        LOGI("[%s] size:%d", _str, (int)_size);
        free(_str);
}

load_assetで文字列データを読み込んで、ログに出力しています。


最後についでなんですが、アプリの定義は native側に持っていこうと、1フレームの間隔は initNativeの戻り値で native側から取得するように変更しました。

プロジェクト一式はこちらから。
[Android プログラミング]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット