【備忘】Android ndk下用AssetManager讀取assets的資源。
阿新 • • 發佈:2018-12-27
@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來連線有關的庫。
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
if( iRet <= 0 )
{
delete [] pData;
pData = NULL;
}
}
AAsset_close(pAsset);
if( pAsset == NULL ) size = 0;
if( pSize )
*pSize = size;
} while