diff --git a/monero_libwallet2_api_c/CMakeLists.txt b/monero_libwallet2_api_c/CMakeLists.txt index eb1714e..60be91c 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 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 #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 +} diff --git a/patches/monero/0019-fix-for-coin-control-patch.patch b/patches/monero/0019-fix-for-coin-control-patch.patch new file mode 100644 index 0000000..b7ff7f9 --- /dev/null +++ b/patches/monero/0019-fix-for-coin-control-patch.patch @@ -0,0 +1,97 @@ +From 8f93306ed526e0e573b33fc7dd40abbba7e7a00a Mon Sep 17 00:00:00 2001 +From: Czarek Nakamoto +Date: Tue, 15 Oct 2024 18:00:05 +0200 +Subject: [PATCH] fix for coin control patch + +--- + src/wallet/api/coins.cpp | 1 + + src/wallet/api/wallet.cpp | 36 +++++++++++++++++++++++++++++++++++- + 2 files changed, 36 insertions(+), 1 deletion(-) + +diff --git a/src/wallet/api/coins.cpp b/src/wallet/api/coins.cpp +index 2321c638d..ef12141cf 100644 +--- a/src/wallet/api/coins.cpp ++++ b/src/wallet/api/coins.cpp +@@ -114,6 +114,7 @@ void CoinsImpl::setFrozen(int index) + { + try + { ++ LOG_ERROR("Freezing coin: " << index); + m_wallet->m_wallet->freeze(index); + refresh(); + } +diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp +index ec7d60ec0..db127dae4 100644 +--- a/src/wallet/api/wallet.cpp ++++ b/src/wallet/api/wallet.cpp +@@ -2116,6 +2116,7 @@ PendingTransaction *WalletImpl::createTransactionMultDest(const std::vectornettype(), dst_addr[i])) { + // TODO: copy-paste 'if treating as an address fails, try as url' from simplewallet.cpp:1982 +@@ -2137,6 +2138,7 @@ PendingTransaction *WalletImpl::createTransactionMultDest(const std::vectorunlocked_balance(subaddr_account, true); ++ // if (maxAllowedSpend < amountSum) { ++ // error = true; ++ // setStatusError(tr("Amount you are trying to spend is larger than unlocked amount")); ++ // break; ++ // } + std::vector preferred_input_list; + if (!preferred_inputs.empty()) { ++ LOG_ERROR("empty"); ++ + for (const auto &public_key : preferred_inputs) { + crypto::key_image keyImage; + bool r = epee::string_tools::hex_to_pod(public_key, keyImage); +- if (!r) { ++ if (!r) { + error = true; + setStatusError(tr("failed to parse key image")); + break; + } ++ if (m_wallet->frozen(keyImage)) { ++ error = true; ++ setStatusError(tr("refusing to spend frozen coin")); ++ break; ++ } ++ + preferred_input_list.push_back(keyImage); + } ++ } else { ++ LOG_ERROR("not empty"); ++ ++ boost::shared_lock transfers_lock(m_wallet->m_transfers_mutex); ++ for (size_t i = 0; i < m_wallet->get_num_transfer_details(); ++i) { ++ const tools::wallet2::transfer_details &td = m_wallet->get_transfer_details(i); ++ LOG_ERROR("COIN: " << i << ": " << td.amount() << "; "<frozen(td)); ++ if (td.m_spent) continue; ++ LOG_ERROR("is frozen"); ++ if (!td.m_frozen) { ++ LOG_ERROR("isn't:"); ++ LOG_ERROR("hash: " << td.m_key_image << "; " << td.amount()); ++ preferred_input_list.push_back(td.m_key_image); ++ } ++ } ++ } ++ for (const auto &de : preferred_input_list) { ++ LOG_ERROR("preferred input: " << de); + } + if (error) { + break; +-- +2.39.5 (Apple Git-154) +