Android ndk下用AssetManager读取assets的资源

故事扮演 提交于 2019-11-29 21:51:50

在使用 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的LOCAL_LDLIBS选项里加上-landroid来链接有关的库。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!