mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:18:11 +00:00
AK: Send dbgln/outln/warnln to the NDK logger on Android
The embedding application is responsible for setting the android log tag. If it doesn't a default of "Serenity" will be used for any Lagom code.
This commit is contained in:
parent
e267f8e68f
commit
0c5a546dca
3 changed files with 110 additions and 9 deletions
|
@ -8,6 +8,7 @@
|
||||||
#include <AK/Format.h>
|
#include <AK/Format.h>
|
||||||
#include <AK/GenericLexer.h>
|
#include <AK/GenericLexer.h>
|
||||||
#include <AK/IntegralMath.h>
|
#include <AK/IntegralMath.h>
|
||||||
|
#include <AK/String.h>
|
||||||
#include <AK/StringBuilder.h>
|
#include <AK/StringBuilder.h>
|
||||||
#include <AK/kstdio.h>
|
#include <AK/kstdio.h>
|
||||||
|
|
||||||
|
@ -25,6 +26,10 @@
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(AK_OS_ANDROID)
|
||||||
|
# include <android/log.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace AK {
|
namespace AK {
|
||||||
|
|
||||||
class FormatParser : public GenericLexer {
|
class FormatParser : public GenericLexer {
|
||||||
|
@ -895,6 +900,45 @@ void vout(FILE* file, StringView fmtstr, TypeErasedFormatParams& params, bool ne
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef AK_OS_ANDROID
|
||||||
|
static char const* s_log_tag_name = "Serenity";
|
||||||
|
void set_log_tag_name(char const* tag_name)
|
||||||
|
{
|
||||||
|
static String s_log_tag_storage;
|
||||||
|
// NOTE: Make sure to copy the null terminator
|
||||||
|
s_log_tag_storage = MUST(String::from_utf8({ tag_name, strlen(tag_name) + 1 }));
|
||||||
|
s_log_tag_name = s_log_tag_storage.bytes_as_string_view().characters_without_null_termination();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vout(LogLevel log_level, StringView fmtstr, TypeErasedFormatParams& params, bool newline)
|
||||||
|
{
|
||||||
|
StringBuilder builder;
|
||||||
|
MUST(vformat(builder, fmtstr, params));
|
||||||
|
|
||||||
|
if (newline)
|
||||||
|
builder.append('\n');
|
||||||
|
builder.append('\0');
|
||||||
|
|
||||||
|
auto const string = builder.string_view();
|
||||||
|
|
||||||
|
auto ndk_log_level = ANDROID_LOG_UNKNOWN;
|
||||||
|
switch (log_level) {
|
||||||
|
case LogLevel ::Debug:
|
||||||
|
ndk_log_level = ANDROID_LOG_DEBUG;
|
||||||
|
break;
|
||||||
|
case LogLevel ::Info:
|
||||||
|
ndk_log_level = ANDROID_LOG_INFO;
|
||||||
|
break;
|
||||||
|
case LogLevel::Warning:
|
||||||
|
ndk_log_level = ANDROID_LOG_WARN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
__android_log_write(ndk_log_level, s_log_tag_name, string.characters_without_null_termination());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool is_debug_enabled = true;
|
static bool is_debug_enabled = true;
|
||||||
|
|
||||||
void set_debug_enabled(bool value)
|
void set_debug_enabled(bool value)
|
||||||
|
@ -944,7 +988,9 @@ void vdbg(StringView fmtstr, TypeErasedFormatParams& params, bool newline)
|
||||||
MUST(vformat(builder, fmtstr, params));
|
MUST(vformat(builder, fmtstr, params));
|
||||||
if (newline)
|
if (newline)
|
||||||
builder.append('\n');
|
builder.append('\n');
|
||||||
|
#ifdef AK_OS_ANDROID
|
||||||
|
builder.append('\0');
|
||||||
|
#endif
|
||||||
auto const string = builder.string_view();
|
auto const string = builder.string_view();
|
||||||
|
|
||||||
#ifdef AK_OS_SERENITY
|
#ifdef AK_OS_SERENITY
|
||||||
|
@ -955,7 +1001,11 @@ void vdbg(StringView fmtstr, TypeErasedFormatParams& params, bool newline)
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef AK_OS_ANDROID
|
||||||
|
__android_log_write(ANDROID_LOG_DEBUG, s_log_tag_name, string.characters_without_null_termination());
|
||||||
|
#else
|
||||||
dbgputstr(string.characters_without_null_termination(), string.length());
|
dbgputstr(string.characters_without_null_termination(), string.length());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef KERNEL
|
#ifdef KERNEL
|
||||||
|
|
63
AK/Format.h
63
AK/Format.h
|
@ -557,7 +557,7 @@ struct Formatter<nullptr_t> : Formatter<FlatPtr> {
|
||||||
|
|
||||||
ErrorOr<void> vformat(StringBuilder&, StringView fmtstr, TypeErasedFormatParams&);
|
ErrorOr<void> vformat(StringBuilder&, StringView fmtstr, TypeErasedFormatParams&);
|
||||||
|
|
||||||
#ifndef KERNEL
|
#if !defined(KERNEL)
|
||||||
void vout(FILE*, StringView fmtstr, TypeErasedFormatParams&, bool newline = false);
|
void vout(FILE*, StringView fmtstr, TypeErasedFormatParams&, bool newline = false);
|
||||||
|
|
||||||
template<typename... Parameters>
|
template<typename... Parameters>
|
||||||
|
@ -576,20 +576,18 @@ void outln(FILE* file, CheckedFormatString<Parameters...>&& fmtstr, Parameters c
|
||||||
|
|
||||||
inline void outln(FILE* file) { fputc('\n', file); }
|
inline void outln(FILE* file) { fputc('\n', file); }
|
||||||
|
|
||||||
|
# ifndef AK_OS_ANDROID
|
||||||
template<typename... Parameters>
|
template<typename... Parameters>
|
||||||
void out(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) { out(stdout, move(fmtstr), parameters...); }
|
void out(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
|
||||||
|
{
|
||||||
|
out(stdout, move(fmtstr), parameters...);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename... Parameters>
|
template<typename... Parameters>
|
||||||
void outln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) { outln(stdout, move(fmtstr), parameters...); }
|
void outln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) { outln(stdout, move(fmtstr), parameters...); }
|
||||||
|
|
||||||
inline void outln() { outln(stdout); }
|
inline void outln() { outln(stdout); }
|
||||||
|
|
||||||
# define outln_if(flag, fmt, ...) \
|
|
||||||
do { \
|
|
||||||
if constexpr (flag) \
|
|
||||||
outln(fmt, ##__VA_ARGS__); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
template<typename... Parameters>
|
template<typename... Parameters>
|
||||||
void warn(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
|
void warn(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
|
||||||
{
|
{
|
||||||
|
@ -600,6 +598,55 @@ template<typename... Parameters>
|
||||||
void warnln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) { outln(stderr, move(fmtstr), parameters...); }
|
void warnln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) { outln(stderr, move(fmtstr), parameters...); }
|
||||||
|
|
||||||
inline void warnln() { outln(stderr); }
|
inline void warnln() { outln(stderr); }
|
||||||
|
# else // v Android ^ No Android
|
||||||
|
enum class LogLevel {
|
||||||
|
Debug,
|
||||||
|
Info,
|
||||||
|
Warning,
|
||||||
|
};
|
||||||
|
|
||||||
|
void vout(LogLevel, StringView fmtstr, TypeErasedFormatParams&, bool newline = false);
|
||||||
|
|
||||||
|
template<typename... Parameters>
|
||||||
|
void out(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
|
||||||
|
{
|
||||||
|
VariadicFormatParams<AllowDebugOnlyFormatters::Yes, Parameters...> variadic_format_params { parameters... };
|
||||||
|
vout(LogLevel::Info, fmtstr.view(), variadic_format_params);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename... Parameters>
|
||||||
|
void outln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
|
||||||
|
{
|
||||||
|
VariadicFormatParams<AllowDebugOnlyFormatters::Yes, Parameters...> variadic_format_params { parameters... };
|
||||||
|
vout(LogLevel::Info, fmtstr.view(), variadic_format_params, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void outln() { outln(""); }
|
||||||
|
|
||||||
|
template<typename... Parameters>
|
||||||
|
void warn(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
|
||||||
|
{
|
||||||
|
VariadicFormatParams<AllowDebugOnlyFormatters::Yes, Parameters...> variadic_format_params { parameters... };
|
||||||
|
vout(LogLevel::Warning, fmtstr.view(), variadic_format_params);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename... Parameters>
|
||||||
|
void warnln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
|
||||||
|
{
|
||||||
|
VariadicFormatParams<AllowDebugOnlyFormatters::Yes, Parameters...> variadic_format_params { parameters... };
|
||||||
|
vout(LogLevel::Warning, fmtstr.view(), variadic_format_params, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void warnln() { warnln(""); }
|
||||||
|
|
||||||
|
void set_log_tag_name(char const*);
|
||||||
|
# endif // AK_OS_ANDROID
|
||||||
|
|
||||||
|
# define outln_if(flag, fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if constexpr (flag) \
|
||||||
|
outln(fmt, ##__VA_ARGS__); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
# define warnln_if(flag, fmt, ...) \
|
# define warnln_if(flag, fmt, ...) \
|
||||||
do { \
|
do { \
|
||||||
|
|
|
@ -65,3 +65,7 @@ if (APPLE)
|
||||||
target_link_libraries(LibCore PUBLIC "-framework CoreServices")
|
target_link_libraries(LibCore PUBLIC "-framework CoreServices")
|
||||||
target_link_libraries(LibCore PUBLIC "-framework Foundation")
|
target_link_libraries(LibCore PUBLIC "-framework Foundation")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (ANDROID)
|
||||||
|
target_link_libraries(LibCore PRIVATE log)
|
||||||
|
endif()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue