From f398162d028a35fc22bbfc2e05ff4cd9d0801324 Mon Sep 17 00:00:00 2001 From: Czarek Nakamoto Date: Tue, 15 Oct 2024 13:52:59 +0200 Subject: [PATCH] Enable stdout/stderr logging to logcat on android --- monero_libwallet2_api_c/CMakeLists.txt | 1 + .../src/main/cpp/helpers.cpp | 67 ++++++++++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/monero_libwallet2_api_c/CMakeLists.txt b/monero_libwallet2_api_c/CMakeLists.txt index eb1714ef..60be91cf 100644 --- a/monero_libwallet2_api_c/CMakeLists.txt +++ b/monero_libwallet2_api_c/CMakeLists.txt @@ -32,6 +32,7 @@ if(${HOST_ABI} STREQUAL "x86_64-linux-android" OR ${HOST_ABI} STREQUAL "aarch64-linux-android" OR ${HOST_ABI} STREQUAL "armv7a-linux-androideabi") add_link_options(-stdlib=libc++ -static-libstdc++) + set(EXTRA_LIBS_ANDROID log) endif() add_library( wallet2_api_c diff --git a/monero_libwallet2_api_c/src/main/cpp/helpers.cpp b/monero_libwallet2_api_c/src/main/cpp/helpers.cpp index d6928793..8e45eba9 100644 --- a/monero_libwallet2_api_c/src/main/cpp/helpers.cpp +++ b/monero_libwallet2_api_c/src/main/cpp/helpers.cpp @@ -9,6 +9,71 @@ #include #include #include +#include + +#ifdef __ANDROID__ +#include + +#define LOG_TAG "moneroc" +#define BUFFER_SIZE 1024*32 + +static int stdoutToLogcat(const char *buf, int size) { + __android_log_write(ANDROID_LOG_INFO, LOG_TAG, buf); + return size; +} + +static int stderrToLogcat(const char *buf, int size) { + __android_log_write(ANDROID_LOG_ERROR, LOG_TAG, buf); + return size; +} + +void redirectStdoutThread(int pipe_stdout[2]) { + char bufferStdout[BUFFER_SIZE]; + while (true) { + int read_size = read(pipe_stdout[0], bufferStdout, sizeof(bufferStdout) - 1); + if (read_size > 0) { + bufferStdout[read_size] = '\0'; + stdoutToLogcat(bufferStdout, read_size); + } + } +} + +void redirectStderrThread(int pipe_stderr[2]) { + char bufferStderr[BUFFER_SIZE]; + while (true) { + int read_size = read(pipe_stderr[0], bufferStderr, sizeof(bufferStderr) - 1); + if (read_size > 0) { + bufferStderr[read_size] = '\0'; + stderrToLogcat(bufferStderr, read_size); + } + } +} + +void setupAndroidLogging() { + static int pfdStdout[2]; + static int pfdStderr[2]; + + pipe(pfdStdout); + pipe(pfdStderr); + + dup2(pfdStdout[1], STDOUT_FILENO); + dup2(pfdStderr[1], STDERR_FILENO); + + std::thread stdoutThread(redirectStdoutThread, pfdStdout); + std::thread stderrThread(redirectStderrThread, pfdStderr); + + stdoutThread.detach(); + stderrThread.detach(); +} + +#endif // __ANDROID__ + +__attribute__((constructor)) +void library_init() { +#ifdef __ANDROID__ + setupAndroidLogging(); // This will now run automatically when the library is loaded +#endif +} const char* vectorToString(const std::vector& vec, const std::string separator) { // Check if the vector is empty @@ -195,4 +260,4 @@ std::vector splitStringUint(const std::string& str, const std::string& } tokens.push_back(std::stoull(content)); // Inserting the last token return tokens; -} \ No newline at end of file +}