Android ndk下用AssetManager读取assets的资源

@import url(http://www.cppblog.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
在使用 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来连接有关的库。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值