diff --git a/Common/LogManager.cpp b/Common/LogManager.cpp index cdcb224667..26b1ed49ec 100644 --- a/Common/LogManager.cpp +++ b/Common/LogManager.cpp @@ -56,7 +56,7 @@ void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char if (instance) { instance->Log(level, type, file, line, fmt, args); } else { - // Fall back to printf if we're before the log manager has been initialized. + // Fall back to printf or direct android logger with a small buffer if the log manager hasn't been initialized yet. #if PPSSPP_PLATFORM(ANDROID) char temp[512]; vsnprintf(temp, sizeof(temp), fmt, args); diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index b74d345dc4..e6375a4b11 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -198,38 +198,44 @@ AndroidGraphicsContext *graphicsContext; #define LOG_APP_NAME "PPSSPP" #endif -#ifdef _DEBUG -#define DLOG(...) __android_log_print(ANDROID_LOG_INFO, LOG_APP_NAME, __VA_ARGS__); -#else -#define DLOG(...) -#endif - -#define ILOG(...) __android_log_print(ANDROID_LOG_INFO, LOG_APP_NAME, __VA_ARGS__); -#define WLOG(...) __android_log_print(ANDROID_LOG_WARN, LOG_APP_NAME, __VA_ARGS__); -#define ELOG(...) __android_log_print(ANDROID_LOG_ERROR, LOG_APP_NAME, __VA_ARGS__); -#define FLOG(...) __android_log_print(ANDROID_LOG_FATAL, LOG_APP_NAME, __VA_ARGS__); - #define MessageBox(a, b, c, d) __android_log_print(ANDROID_LOG_INFO, APP_NAME, "%s %s", (b), (c)); void AndroidLogger::Log(const LogMessage &message) { - // Log with simplified headers as Android already provides timestamp etc. + int mode; switch (message.level) { - case LogTypes::LVERBOSE: - case LogTypes::LDEBUG: - case LogTypes::LINFO: - ILOG("[%s] %s", message.log, message.msg.c_str()); + case LogTypes::LWARNING: + mode = ANDROID_LOG_WARN; break; case LogTypes::LERROR: - ELOG("[%s] %s", message.log, message.msg.c_str()); + mode = ANDROID_LOG_ERROR; break; - case LogTypes::LWARNING: - WLOG("[%s] %s", message.log, message.msg.c_str()); - break; - case LogTypes::LNOTICE: default: - ILOG("[%s] !!! %s", message.log, message.msg.c_str()); + mode = ANDROID_LOG_INFO; break; } + + // Long log messages need splitting up. + // Not sure what the actual limit is (seems to vary), but let's be conservative. + const size_t maxLogLength = 512; + if (message.msg.length() < maxLogLength) { + // Log with simplified headers as Android already provides timestamp etc. + __android_log_print(mode, LOG_APP_NAME, "[%s] %s", message.log, message.msg.c_str()); + } else { + std::string msg = message.msg; + + // Ideally we should split at line breaks, but it's at least fairly usable anyway. + std::string first_part = msg.substr(0, maxLogLength); + __android_log_print(mode, LOG_APP_NAME, "[%s] %s", message.log, first_part.c_str()); + msg = msg.substr(maxLogLength); + + while (msg.length() > maxLogLength) { + std::string first_part = msg.substr(0, maxLogLength); + __android_log_print(mode, LOG_APP_NAME, "%s", first_part.c_str()); + msg = msg.substr(maxLogLength); + } + // Print the final part. + __android_log_print(mode, LOG_APP_NAME, "%s", msg.c_str()); + } } JNIEnv* getEnv() {