common: logging: Implement Android logcat backend.
This commit is contained in:
		| @@ -155,6 +155,26 @@ public: | ||||
|     void EnableForStacktrace() override {} | ||||
| }; | ||||
|  | ||||
| #ifdef ANDROID | ||||
| /** | ||||
|  * Backend that writes to the Android logcat | ||||
|  */ | ||||
| class LogcatBackend : public Backend { | ||||
| public: | ||||
|     explicit LogcatBackend() = default; | ||||
|  | ||||
|     ~LogcatBackend() override = default; | ||||
|  | ||||
|     void Write(const Entry& entry) override { | ||||
|         PrintMessageToLogcat(entry); | ||||
|     } | ||||
|  | ||||
|     void Flush() override {} | ||||
|  | ||||
|     void EnableForStacktrace() override {} | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| bool initialization_in_progress_suppress_logging = true; | ||||
|  | ||||
| /** | ||||
| @@ -260,6 +280,9 @@ private: | ||||
|         lambda(static_cast<Backend&>(debugger_backend)); | ||||
|         lambda(static_cast<Backend&>(color_console_backend)); | ||||
|         lambda(static_cast<Backend&>(file_backend)); | ||||
| #ifdef ANDROID | ||||
|         lambda(static_cast<Backend&>(lc_backend)); | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     static void Deleter(Impl* ptr) { | ||||
| @@ -272,6 +295,9 @@ private: | ||||
|     DebuggerBackend debugger_backend{}; | ||||
|     ColorConsoleBackend color_console_backend{}; | ||||
|     FileBackend file_backend; | ||||
| #ifdef ANDROID | ||||
|     LogcatBackend lc_backend{}; | ||||
| #endif | ||||
|  | ||||
|     MPSCQueue<Entry> message_queue{}; | ||||
|     std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()}; | ||||
|   | ||||
| @@ -8,6 +8,10 @@ | ||||
| #include <windows.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef ANDROID | ||||
| #include <android/log.h> | ||||
| #endif | ||||
|  | ||||
| #include "common/assert.h" | ||||
| #include "common/logging/filter.h" | ||||
| #include "common/logging/log.h" | ||||
| @@ -106,4 +110,35 @@ void PrintColoredMessage(const Entry& entry) { | ||||
| #undef ESC | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void PrintMessageToLogcat(const Entry& entry) { | ||||
| #ifdef ANDROID | ||||
|     const auto str = FormatLogMessage(entry); | ||||
|  | ||||
|     android_LogPriority android_log_priority; | ||||
|     switch (entry.log_level) { | ||||
|     case Level::Trace: | ||||
|         android_log_priority = ANDROID_LOG_VERBOSE; | ||||
|         break; | ||||
|     case Level::Debug: | ||||
|         android_log_priority = ANDROID_LOG_DEBUG; | ||||
|         break; | ||||
|     case Level::Info: | ||||
|         android_log_priority = ANDROID_LOG_INFO; | ||||
|         break; | ||||
|     case Level::Warning: | ||||
|         android_log_priority = ANDROID_LOG_WARN; | ||||
|         break; | ||||
|     case Level::Error: | ||||
|         android_log_priority = ANDROID_LOG_ERROR; | ||||
|         break; | ||||
|     case Level::Critical: | ||||
|         android_log_priority = ANDROID_LOG_FATAL; | ||||
|         break; | ||||
|     case Level::Count: | ||||
|         UNREACHABLE(); | ||||
|     } | ||||
|     __android_log_print(android_log_priority, "CitraNative", "%s", str.c_str()); | ||||
| #endif | ||||
| } | ||||
| } // namespace Common::Log | ||||
|   | ||||
| @@ -15,4 +15,6 @@ std::string FormatLogMessage(const Entry& entry); | ||||
| void PrintMessage(const Entry& entry); | ||||
| /// Prints the same message as `PrintMessage`, but colored according to the severity level. | ||||
| void PrintColoredMessage(const Entry& entry); | ||||
| /// Formats and prints a log entry to the android logcat. | ||||
| void PrintMessageToLogcat(const Entry& entry); | ||||
| } // namespace Common::Log | ||||
|   | ||||
		Reference in New Issue
	
	Block a user