Hi guys
I can’t speak English very well. Pardon me.
I found addImageAsync Crash Bug for android device.(ios ok)
I created test project.
test android
********** Crash dump: **********
Build fingerprint: 'LGE/batman_lgu/batman_lgu:4.0.4/IMM76D/LG-F100L-V29j.1c1b3e6c95:user/release-keys'
pid: 17045, tid: 17068 >>> com.abluewind.AsyncTest <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00001921
Stack frame #00 pc 0010b7b4 /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d18unzReadCurrentFileEPvS0_j): Routine unzReadCurrentFile in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/support/zip_support/unzip.cpp:1813
Stack frame #01 pc 00109fca /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d7ZipFile11getFileDataERKSsPm): Routine getFileData in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/support/zip_support/ZipUtils.cpp:422
Stack frame #02 pc 000fd514 /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d11CCFileUtils11getFileDataEPKcS2_Pm): Routine getFileData in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/platform/android/CCFileUtils.cpp:99
Stack frame #03 pc 000ff1c6 /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d7CCImage27initWithImageFileThreadSafeEPKcNS0_12EImageFormatE): Routine initWithImageFileThreadSafe in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/platform/CCImageCommon_cpp.h:110
Stack frame #04 pc 0010f394 /data/data/com.abluewind.AsyncTest/lib/libgame.so: Routine loadImage in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/textures/CCTextureCache.cpp:162
Stack frame #05 pc 0001337c /system/lib/libc.so (__thread_entry)
Stack frame #06 pc 00012ed0 /system/lib/libc.so (pthread_create)
Crash dump is completed
********** Crash dump: **********
Build fingerprint: 'LGE/batman_lgu/batman_lgu:4.0.4/IMM76D/LG-F100L-V29j.1c1b3e6c95:user/release-keys'
pid: 17099, tid: 17118 >>> com.abluewind.AsyncTest <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 6572a352
Stack frame #00 pc 0010b7b6 /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d18unzReadCurrentFileEPvS0_j): Routine unzReadCurrentFile in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/support/zip_support/unzip.cpp:1813
Stack frame #01 pc 00109fca /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d7ZipFile11getFileDataERKSsPm): Routine getFileData in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/support/zip_support/ZipUtils.cpp:422
Stack frame #02 pc 000fd514 /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d11CCFileUtils11getFileDataEPKcS2_Pm): Routine getFileData in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/platform/android/CCFileUtils.cpp:99
Stack frame #03 pc 000ff1c6 /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d7CCImage27initWithImageFileThreadSafeEPKcNS0_12EImageFormatE): Routine initWithImageFileThreadSafe in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/platform/CCImageCommon_cpp.h:110
Stack frame #04 pc 0010f394 /data/data/com.abluewind.AsyncTest/lib/libgame.so: Routine loadImage in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/textures/CCTextureCache.cpp:162
Stack frame #05 pc 0001337c /system/lib/libc.so (__thread_entry)
Stack frame #06 pc 00012ed0 /system/lib/libc.so (pthread_create)
So, I modified source code.(ZipUtils.cpp)
use mutex lock.
ZipFile::ZipFile(const std::string &zipFile, const std::string &filter)
: m_data(new ZipFilePrivate)
{
pthread_mutex_init(&s_asynctt, NULL);
m_data->zipFile = unzOpen(zipFile.c_str());
if (m_data->zipFile)
{
setFilter(filter);
}
}
ZipFile::~ZipFile()
{
if (m_data && m_data->zipFile)
{
unzClose(m_data->zipFile);
}
CC_SAFE_DELETE(m_data);
pthread_mutex_destroy(&s_asynctt);
}
unsigned char *ZipFile::getFileData(const std::string &fileName, unsigned long *pSize)
{
unsigned char * pBuffer = NULL;
if (pSize)
{
*pSize = 0;
}
pthread_mutex_lock(&s_asynctt);
do
{
CC_BREAK_IF(!m_data->zipFile);
CC_BREAK_IF(fileName.empty());
ZipFilePrivate::FileListContainer::const_iterator it = m_data->fileList.find(fileName);
CC_BREAK_IF(it == m_data->fileList.end());
ZipEntryInfo fileInfo = it->second;
int nRet = unzGoToFilePos(m_data->zipFile, &fileInfo.pos);
CC_BREAK_IF(UNZ_OK != nRet);
nRet = unzOpenCurrentFile(m_data->zipFile);
CC_BREAK_IF(UNZ_OK != nRet);
pBuffer = new unsigned char[fileInfo.uncompressed_size];
int nSize = 0;
nSize = unzReadCurrentFile(m_data->zipFile, pBuffer, fileInfo.uncompressed_size);
char test[256] = {0};
sprintf(test, "fileName : %s, nSize : %d, uncompressed_size : %d", fileName.c_str(), nSize, (int)fileInfo.uncompressed_size);
CCLog(test);
CCAssert(nSize == 0 || nSize == (int)fileInfo.uncompressed_size, "the file size is wrong");
if (pSize)
{
*pSize = fileInfo.uncompressed_size;
}
unzCloseCurrentFile(m_data->zipFile);
} while (0);
pthread_mutex_unlock(&s_asynctt);
return pBuffer;
}
and, Crash was not generated.
I guess ‘m_data’ as problem.