您的位置:首页 > 移动开发 > Android开发

Android ndk下用AssetManager读取assets的资源

2014-05-04 21:41 603 查看
转自:http://www.cppblog.com/johndragon/archive/2012/12/28/196754.html

在使用 cocos2dx 在 Android 上进行游戏开发时,遇到了奇怪的事情,无论什么代码,都无法读资源文件。不得以只好寻求更高版本的Api。

在Android ndk api level 9 之后,提供了一套称为 AssetManager 的api。

这个api 的工作原理是

- Java通过JNI把getAssets得到的AssetManager传递给一个JNI的c函数。
- JNI的c函数通过 AAssetManager_fromJava 来取到这个AssetManager对象。
- 通过一系列的 AssetManager 的api来操作Assets。

C的jni函数如下

static AAssetManager * gAssetMgr = NULL;
extern "C"
{
  void Java_org_cocos2dx_lib_Cocos2dxActivity_nativeSetAssetManager(JNIEnv* env, jclass cls, jobject assetManager)
  {
  gAssetMgr = AAssetManager_fromJava( env, assetManager );
  }
};


读取资源的方法如下

do{
AAsset * pAsset = AAssetManager_open(gAssetMgr, pszFileName, AASSET_MODE_UNKNOWN);
if( pAsset == NULL ) break;
size_t size = AAsset_getLength(pAsset);
if( size > 0 )
{
pData = new unsigned char[size];
int iRet = AAsset_read( pAsset, pData, size);
if( iRet <= 0 )
{
delete [] pData;
pData = NULL;
}
}
AAsset_close(pAsset);
if( pAsset == NULL ) size = 0;
if( pSize )
*pSize = size;
} while(0);


这里修改的是cocos2dx的CCFileUtils_Android.cpp 中的getFileData 函数。

最后,在编译libgame.so 时,要注意在Android.mk里的LD参数里加上-landroid来连接有关的库。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: