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來連接有關的庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM