Index: client/CMT.cpp =================================================================== --- client/CMT.cpp (revision 3494) +++ client/CMT.cpp (working copy) @@ -194,7 +194,7 @@ #ifdef _WIN32 int wmain(int argc, wchar_t* argv[]) -#elif defined(__APPLE__) +#elif defined(__APPLE__) || defined(ANDROID) int SDL_main(int argc, char *argv[]) #else int main(int argc, char** argv) @@ -217,6 +217,13 @@ } fclose(check); #endif + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "%s:%s:%d", __FUNCTION__, __FILE__, __LINE__); + + // Fix crashing locale shit in Boost + setenv( "LANG", "C", 1 ); + setenv( "LANGUAGE", "C", 1 ); + setenv( "LC_ALL", "C", 1 ); + std::cout << "Starting... " << std::endl; po::options_description opts("Allowed options"); opts.add_options() @@ -289,6 +296,7 @@ // Initialize logging based on settings logConfig.configure(); + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__); // Some basic data validation to produce better error messages in cases of incorrect install auto testFile = [](std::string filename, std::string message) -> bool @@ -300,22 +308,31 @@ return false; }; + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__); if (!testFile("DATA/HELP.TXT", "Heroes III data") || !testFile("MODS/VCMI/MOD.JSON", "VCMI mod") || - !testFile("DATA/StackQueueBgBig.PCX", "VCMI data")) + !testFile("DATA/StackQueueBgBig.PCX", "VCMI data")) + { + __android_log_print(ANDROID_LOG_ERROR, "VCMI", "Cannot find data files!"); exit(1); // These are unrecoverable errors + } + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__); // these two are optional + some installs have them on CD and not in data directory testFile("VIDEO/GOOD1A.SMK", "campaign movies"); testFile("SOUNDS/G1A.WAV", "campaign music"); //technically not a music but voiced intro sounds + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__); + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__); conf.init(); logGlobal->infoStream() <<"Loading settings: "<infoStream() << NAME; + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__); srand ( time(nullptr) ); + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__); const JsonNode& video = settings["video"]; const JsonNode& res = video["screenRes"]; @@ -330,6 +347,7 @@ exit(EXIT_FAILURE); } + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__); if(!gNoGUI) { if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO)) @@ -360,7 +378,8 @@ //we can properly play intro only in the main thread, so we have to move loading to the separate thread - boost::thread loading(init); + //boost::thread loading(init); + init(); // boost::thread crashes when destroyed if(!gNoGUI ) { @@ -370,7 +389,7 @@ } CSDL_Ext::update(screen); - loading.join(); + //loading.join(); logGlobal->infoStream()<<"Initialization of VCMI (together): "< record.level) return; std::string message = formatter.format(record); +#ifdef ANDROID + __android_log_print(ANDROID_LOG_INFO, "VCMI", "%s", message.c_str()); +#endif bool printToStdErr = record.level >= ELogLevel::WARN; if(console) { Index: lib/logging/CLogger.h =================================================================== --- lib/logging/CLogger.h (revision 3494) +++ lib/logging/CLogger.h (working copy) @@ -289,3 +289,11 @@ CLogFormatter formatter; mutable boost::mutex mx; }; + +#ifdef ANDROID +static bool AndroidStaticInitLog() +{ + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Static init: %s", __SOURCE_FILE__); +} +static bool AndroidStaticInitLogFlag = AndroidStaticInitLog(); +#endif Index: lib/JsonNode.cpp =================================================================== --- lib/JsonNode.cpp (revision 3494) +++ lib/JsonNode.cpp (working copy) @@ -1574,7 +1574,7 @@ //reserve place and *move* remaining data from source to dest source.Vector().reserve(source.Vector().size() + dest.Vector().size()); - std::move(source.Vector().begin() + total, source.Vector().end(), + std::copy(source.Vector().begin() + total, source.Vector().end(), std::back_inserter(dest.Vector())); } break; Index: lib/filesystem/Filesystem.cpp =================================================================== --- lib/filesystem/Filesystem.cpp (revision 3494) +++ lib/filesystem/Filesystem.cpp (working copy) @@ -24,14 +24,14 @@ ResourceID::ResourceID(std::string name) { - CFileInfo info(std::move(name)); + CFileInfo info(/*std::move*/(name)); setName(info.getStem()); setType(info.getType()); } ResourceID::ResourceID(std::string name, EResType::Type type) { - setName(std::move(name)); + setName(/*std::move*/(name)); setType(type); } @@ -47,7 +47,7 @@ void ResourceID::setName(std::string name) { - this->name = std::move(name); + this->name = /*std::move*/(name); size_t dotPos = this->name.find_last_of("/."); Index: lib/filesystem/CFileInfo.cpp =================================================================== --- lib/filesystem/CFileInfo.cpp (revision 3494) +++ lib/filesystem/CFileInfo.cpp (working copy) @@ -7,7 +7,7 @@ } CFileInfo::CFileInfo(std::string name) - : name(std::move(name)) + : name(/*std::move*/(name)) { } Index: lib/VCMIDirs.cpp =================================================================== --- lib/VCMIDirs.cpp (revision 3494) +++ lib/VCMIDirs.cpp (working copy) @@ -15,11 +15,16 @@ VCMIDirs::VCMIDirs() { + char buf[1024] = ""; + getcwd(buf, sizeof(buf)); + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "%s:%s:%d: mkdir '%s' '%s' '%s' '%s' curdir '%s'", __FUNCTION__, __FILE__, __LINE__, + userDataPath().c_str(), userCachePath().c_str(), userConfigPath().c_str(), userSavePath().c_str(), buf); // initialize local directory and create folders to which VCMI needs write access boost::filesystem::create_directory(userDataPath()); boost::filesystem::create_directory(userCachePath()); boost::filesystem::create_directory(userConfigPath()); boost::filesystem::create_directory(userSavePath()); + __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "%s:%s:%d", __FUNCTION__, __FILE__, __LINE__); } VCMIDirs & VCMIDirs::get() @@ -115,8 +120,10 @@ std::string VCMIDirs::userDataPath() const { +#ifndef ANDROID if (getenv("HOME") != nullptr ) return std::string(getenv("HOME")) + "/.vcmi"; +#endif return "."; } Index: lib/vcmi_endian.h =================================================================== --- lib/vcmi_endian.h (revision 3494) +++ lib/vcmi_endian.h (working copy) @@ -19,7 +19,7 @@ * memory. On big endian machines, the value will be byteswapped. */ -#if defined(linux) && (defined(sparc) || defined(__arm__)) +#if defined(ANDROID) || defined(linux) && (defined(sparc) || defined(__arm__)) /* SPARC does not support unaligned memory access. Let gcc know when * to emit the right code. */ struct unaligned_Uint16 { ui16 val __attribute__(( packed )); };