食品偽装だらけ2013/11/04

阪急阪神ホテルズのレストランでの食品偽装が発覚して以来、全国各地のホテルで次々に同じような偽装が明るみになっているようです。
これだけあると、最初に批判された阪急阪神ホテルズでは「どこもやってることだ」と言いたかったんじゃないでしょうか?
むしろ便乗ではなく、自分のところで問題を発覚させたという点では他のホテルよりマシなのではないかとも思ってしまいます。

ただ種類とか産地とか明らかな間違いはともかく、「フレッシュ」みたいな曖昧な表現は偽装の判断が難しいですけどね。
「一口ひれかつ」なんか一口で食べられたためしがないですし。

この前もラーメン屋で注文した「具だくさんつけ麺」が全然具だくさんに見えませんでしたが、これはどうも間違って普通のつけ麺を出していたらしい。

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", &_size);		// テスト文字列

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

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


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

プロジェクト一式はこちらから。