zoukankan      html  css  js  c++  java
  • Android ndk下用AssetManager读取assets的资源

    转自: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来连接有关的库。
  • 相关阅读:
    修改RedHat7的root用户密码
    Linux目录,rpm及top,vi命令简记
    Centos7或RedHat7下安装Mysql
    异常、线程
    File类
    JDBC的学习(一)
    MySql多表查询_事务_DCL(资料三)
    MySql约束_设计_备份还原(资料二)
    MySql基础_DDL_DML_DQL(资料一)
    算法小结(一)
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/3708004.html
Copyright © 2011-2022 走看看