diff options
| author | Czarek Nakamoto <cyjan@mrcyjanek.net> | 2024-10-15 13:52:59 +0200 |
|---|---|---|
| committer | Czarek Nakamoto <cyjan@mrcyjanek.net> | 2024-10-15 13:52:59 +0200 |
| commit | f398162d028a35fc22bbfc2e05ff4cd9d0801324 (patch) | |
| tree | 5dc8d9f86cca7834721a9f79948d8ab371213827 /monero_libwallet2_api_c/src/main | |
| parent | 44fd5e17bbce52caf681850ac79f463d9ce6bb31 (diff) | |
Enable stdout/stderr logging to logcat on androidandroid_logging
Diffstat (limited to 'monero_libwallet2_api_c/src/main')
| -rw-r--r-- | monero_libwallet2_api_c/src/main/cpp/helpers.cpp | 67 |
1 files changed, 66 insertions, 1 deletions
diff --git a/monero_libwallet2_api_c/src/main/cpp/helpers.cpp b/monero_libwallet2_api_c/src/main/cpp/helpers.cpp index d692879..8e45eba 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 <set> #include <sstream> #include <cstring> +#include <thread> + +#ifdef __ANDROID__ +#include <android/log.h> + +#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<std::string>& vec, const std::string separator) { // Check if the vector is empty @@ -195,4 +260,4 @@ std::vector<uint64_t> 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 +} |
