@@ -1562,6 +1562,228 @@ Java_com_m2049r_xmrwallet_model_Wallet_addSubaddress(JNIEnv *env, jobject instan
15621562 }
15631563}
15641564
1565+ // Add these multisig functions to monerujo.cpp following the existing pattern
1566+ // Corrected based on actual wallet2_api.h interface from Monero v0.18+
1567+
1568+ /* *********************************/
1569+ /* ******** Multisig Support *******/
1570+ /* *********************************/
1571+
1572+ // Check if wallet is multisig
1573+ JNIEXPORT jboolean JNICALL
1574+ Java_com_m2049r_xmrwallet_model_Wallet_isMultisig (JNIEnv *env, jobject instance) {
1575+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1576+ if (wallet == nullptr ) {
1577+ return JNI_FALSE;
1578+ }
1579+ return static_cast <jboolean>(wallet->multisig ().isMultisig );
1580+ }
1581+
1582+ // Get multisig info string for wallet setup
1583+ JNIEXPORT jstring JNICALL
1584+ Java_com_m2049r_xmrwallet_model_Wallet_getMultisigInfo (JNIEnv *env, jobject instance) {
1585+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1586+ if (wallet == nullptr ) {
1587+ return env->NewStringUTF (" " );
1588+ }
1589+ std::string multisigInfo = wallet->getMultisigInfo ();
1590+ return env->NewStringUTF (multisigInfo.c_str ());
1591+ }
1592+
1593+ // Make multisig wallet from collected info
1594+ JNIEXPORT jstring JNICALL
1595+ Java_com_m2049r_xmrwallet_model_Wallet_makeMultisig (JNIEnv *env, jobject instance,
1596+ jobject multisigInfoList, jint threshold) {
1597+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1598+ if (wallet == nullptr || multisigInfoList == nullptr ) {
1599+ return env->NewStringUTF (" " );
1600+ }
1601+
1602+ std::vector<std::string> info = java2cpp (env, multisigInfoList);
1603+ if (info.empty ()) {
1604+ return env->NewStringUTF (" " );
1605+ }
1606+
1607+ std::string result = wallet->makeMultisig (info, (uint32_t ) threshold);
1608+ return env->NewStringUTF (result.c_str ());
1609+ }
1610+
1611+ // Exchange multisig keys for M/N wallets (additional rounds for complex schemes)
1612+ JNIEXPORT jstring JNICALL
1613+ Java_com_m2049r_xmrwallet_model_Wallet_exchangeMultisigKeys (JNIEnv *env, jobject instance,
1614+ jobject multisigInfoList,
1615+ jboolean forceUpdateUseWithCaution) {
1616+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1617+ if (wallet == nullptr || multisigInfoList == nullptr ) {
1618+ return env->NewStringUTF (" " );
1619+ }
1620+
1621+ std::vector<std::string> info = java2cpp (env, multisigInfoList);
1622+ if (info.empty ()) {
1623+ return env->NewStringUTF (" " );
1624+ }
1625+
1626+ std::string result = wallet->exchangeMultisigKeys (info, forceUpdateUseWithCaution);
1627+ return env->NewStringUTF (result.c_str ());
1628+ }
1629+
1630+ // Export multisig images (key images) for wallet synchronization
1631+ // Note: exportMultisigImages takes a reference parameter and returns bool
1632+ JNIEXPORT jstring JNICALL
1633+ Java_com_m2049r_xmrwallet_model_Wallet_exportMultisigImages (JNIEnv *env, jobject instance) {
1634+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1635+ if (wallet == nullptr ) {
1636+ return env->NewStringUTF (" " );
1637+ }
1638+
1639+ std::string images;
1640+ bool success = wallet->exportMultisigImages (images);
1641+ if (!success) {
1642+ LOGE (" exportMultisigImages failed: %s" , wallet->errorString ().c_str ());
1643+ return env->NewStringUTF (" " );
1644+ }
1645+
1646+ return env->NewStringUTF (images.c_str ());
1647+ }
1648+
1649+ // Import multisig images from other participants for wallet synchronization
1650+ JNIEXPORT jint JNICALL
1651+ Java_com_m2049r_xmrwallet_model_Wallet_importMultisigImages (JNIEnv *env, jobject instance,
1652+ jobject multisigImagesList) {
1653+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1654+ if (wallet == nullptr || multisigImagesList == nullptr ) {
1655+ return 0 ;
1656+ }
1657+
1658+ std::vector<std::string> images = java2cpp (env, multisigImagesList);
1659+ if (images.empty ()) {
1660+ return 0 ;
1661+ }
1662+
1663+ size_t imported = wallet->importMultisigImages (images);
1664+ return static_cast <jint>(imported);
1665+ }
1666+
1667+ // Restore a multisig transaction from exported data
1668+ // Returns a PendingTransaction handle that can be signed
1669+ JNIEXPORT jlong JNICALL
1670+ Java_com_m2049r_xmrwallet_model_Wallet_restoreMultisigTransaction (JNIEnv *env, jobject instance,
1671+ jstring txData) {
1672+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1673+ if (wallet == nullptr || txData == nullptr ) {
1674+ return 0 ;
1675+ }
1676+
1677+ JNIStringGuard _txData (env, txData);
1678+ if (!_txData.isValid ()) {
1679+ return 0 ;
1680+ }
1681+
1682+ Monero::PendingTransaction *tx = wallet->restoreMultisigTransaction (_txData.get ());
1683+ return reinterpret_cast <jlong>(tx);
1684+ }
1685+
1686+ // Get multisig state information as a structured object
1687+ JNIEXPORT jobject JNICALL
1688+ Java_com_m2049r_xmrwallet_model_Wallet_getMultisigState (JNIEnv *env, jobject instance) {
1689+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1690+ if (wallet == nullptr ) {
1691+ return nullptr ;
1692+ }
1693+
1694+ Monero::MultisigState state = wallet->multisig ();
1695+
1696+ // Create a Java object to return the multisig state
1697+ // Requires a corresponding Java class: com.m2049r.xmrwallet.model.MultisigState
1698+ // Constructor signature: (ZIII)V for (boolean isMultisig, int isReady, int threshold, int total)
1699+ jclass multisigStateClass = env->FindClass (" com/m2049r/xmrwallet/model/MultisigState" );
1700+ if (multisigStateClass == nullptr ) {
1701+ return nullptr ;
1702+ }
1703+
1704+ jmethodID constructor = env->GetMethodID (multisigStateClass, " <init>" , " (ZIII)V" );
1705+ if (constructor == nullptr ) {
1706+ return nullptr ;
1707+ }
1708+
1709+ jobject stateObject = env->NewObject (multisigStateClass, constructor,
1710+ static_cast <jboolean>(state.isMultisig ),
1711+ static_cast <jint>(state.isReady ),
1712+ static_cast <jint>(state.threshold ),
1713+ static_cast <jint>(state.total ));
1714+
1715+ return stateObject;
1716+ }
1717+
1718+ // Get the number of required signatures (threshold) for the multisig wallet
1719+ JNIEXPORT jint JNICALL
1720+ Java_com_m2049r_xmrwallet_model_Wallet_multisigThreshold (JNIEnv *env, jobject instance) {
1721+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1722+ if (wallet == nullptr ) {
1723+ return 0 ;
1724+ }
1725+ return static_cast <jint>(wallet->multisig ().threshold );
1726+ }
1727+
1728+ // Check if multisig wallet is ready for creating/signing transactions
1729+ JNIEXPORT jboolean JNICALL
1730+ Java_com_m2049r_xmrwallet_model_Wallet_isMultisigReady (JNIEnv *env, jobject instance) {
1731+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1732+ if (wallet == nullptr ) {
1733+ return JNI_FALSE;
1734+ }
1735+ return static_cast <jboolean>(wallet->multisig ().isReady );
1736+ }
1737+
1738+ // Get total number of multisig participants
1739+ JNIEXPORT jint JNICALL
1740+ Java_com_m2049r_xmrwallet_model_Wallet_multisigTotal (JNIEnv *env, jobject instance) {
1741+ Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1742+ if (wallet == nullptr ) {
1743+ return 0 ;
1744+ }
1745+ return static_cast <jint>(wallet->multisig ().total );
1746+ }
1747+
1748+ /* *********************************/
1749+ /* * PendingTransaction Multisig ***/
1750+ /* *********************************/
1751+
1752+ // Export multisig sign data from a pending transaction
1753+ // This data is shared with other signers so they can sign the transaction
1754+ JNIEXPORT jstring JNICALL
1755+ Java_com_m2049r_xmrwallet_model_PendingTransaction_multisigSignData (JNIEnv *env, jobject instance) {
1756+ Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
1757+ if (tx == nullptr ) {
1758+ return env->NewStringUTF (" " );
1759+ }
1760+
1761+ std::string signData = tx->multisigSignData ();
1762+ return env->NewStringUTF (signData.c_str ());
1763+ }
1764+
1765+ // Sign a multisig transaction
1766+ // Note: This method returns void - it modifies the transaction in place
1767+ JNIEXPORT void JNICALL
1768+ Java_com_m2049r_xmrwallet_model_PendingTransaction_signMultisigTx (JNIEnv *env, jobject instance) {
1769+ Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
1770+ if (tx != nullptr ) {
1771+ tx->signMultisigTx ();
1772+ }
1773+ }
1774+
1775+ // Get the list of public keys of signers who have already signed this transaction
1776+ JNIEXPORT jobject JNICALL
1777+ Java_com_m2049r_xmrwallet_model_PendingTransaction_getSignersKeys (JNIEnv *env, jobject instance) {
1778+ Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
1779+ if (tx == nullptr ) {
1780+ return cpp2java (env, std::vector<std::string>());
1781+ }
1782+
1783+ std::vector<std::string> signers = tx->signersKeys ();
1784+ return cpp2java (env, signers);
1785+ }
1786+
15651787// TransactionHistory
15661788JNIEXPORT jint JNICALL
15671789Java_com_m2049r_xmrwallet_model_TransactionHistory_getCount (JNIEnv *env, jobject instance) {
0 commit comments