智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Android ndk下用AssetManager读取assets的资源

Posted on   Bill Yuan  阅读(5971)  评论(0编辑  收藏  举报

转自: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来连接有关的库。
(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示