A Java library for creating Monero applications using RPC and JNI bindings to monero v0.18.3.4 'Fluorine Fermi'.
Build Java applications using RPC or JNI bindings to monero-project/monero. Wallet implementations are interchangeable by conforming to a common interface, MoneroWallet.java.
// connect to daemon
MoneroDaemon daemon = new MoneroDaemonRpc("http://localhost:38081", "superuser", "abctesting123");
long height = daemon.getHeight(); // 1523651
List<MoneroTx> txsInPool = daemon.getTxPool(); // get transactions in the pool
// create wallet from mnemonic phrase using JNI bindings to monero-project
MoneroWalletFull walletFull = MoneroWalletFull.createWallet(new MoneroWalletConfig()
.setPath("sample_wallet_full")
.setPassword("supersecretpassword123")
.setNetworkType(MoneroNetworkType.STAGENET)
.setServerUri("http://localhost:38081")
.setServerUsername("superuser")
.setServerPassword("abctesting123")
.setSeed("hefty value scenic...")
.setRestoreHeight(573936l));
// synchronize the wallet and receive progress notifications
walletFull.sync(new MoneroWalletListener() {
@Override
public void onSyncProgress(long height, long startHeight, long endHeight, double percentDone, String message) {
// feed a progress bar?
}
});
// synchronize in the background every 5 seconds
walletFull.startSyncing(5000l);
// receive notifications when funds are received, confirmed, and unlocked
walletFull.addListener(new MoneroWalletListener() {
@Override
public void onOutputReceived(MoneroOutputWallet output) {
BigInteger amount = output.getAmount();
String txHash = output.getTx().getHash();
Boolean isConfirmed = output.getTx().isConfirmed();
Boolean isLocked = output.getTx().isLocked();
FUNDS_RECEIVED = true;
}
});
// connect to wallet RPC and open wallet
MoneroWalletRpc walletRpc = new MoneroWalletRpc("http://localhost:38083", "rpc_user", "abc123");
walletRpc.openWallet("sample_wallet_rpc", "supersecretpassword123");
String primaryAddress = walletRpc.getPrimaryAddress(); // 555zgduFhmKd2o8rPUz...
BigInteger balance = walletRpc.getBalance(); // 533648366742
List<MoneroTxWallet> txs = walletRpc.getTxs(); // get transactions containing transfers to/from the wallet
// send funds from RPC wallet to full wallet
MoneroTxWallet createdTx = walletRpc.createTx(new MoneroTxConfig()
.setAccountIndex(0)
.setAddress(walletFull.getAddress(1, 0))
.setAmount("250000000000") // send 0.25 XMR (denominated in atomic units)
.setRelay(false)); // create transaction and relay to the network if true
BigInteger fee = createdTx.getFee(); // "Are you sure you want to send... ?"
walletRpc.relayTx(createdTx); // relay the transaction
// recipient receives unconfirmed funds within 5 seconds
TimeUnit.SECONDS.sleep(5);
assertTrue(FUNDS_RECEIVED);
// save and close wallet
walletFull.close(true);
<dependency>
<groupId>io.github.woodser</groupId>
<artifactId>monero-java</artifactId>
<version>0.8.31</version>
</dependency>
compile 'io.github.woodser:monero-java:0.8.33'
./monerod --stagenet
(or use a remote daemon)../monero-wallet-rpc --daemon-address http://localhost:38081 --stagenet --rpc-bind-port 38083 --rpc-login rpc_user:abc123 --wallet-dir ./
[!NOTE] On Windows, if you want to use native wallets instead of monero-wallet-rpc, or if you want to process binary data, first install MSYS2:
- Install MSYS2.
- Environment variables > System variables > Path > Edit > New > C:\msys64\mingw64\bin
If you want to use native wallets instead of monero-wallet-rpc, or if you want to process binary data, native libraries must be used for your specific platform.
For convenience, native libraries for Linux, macOS, and Windows are distributed with monero-java, but they can be built independently from source:
curl -s "https://get.sdkman.io" | bash
sdk install java 21.0.2.fx-librca
git clone --recurse-submodules https://github.com/woodser/monero-java.git
cd ./monero-java
mvn install
./bin/build_libmonero_java.sh
Install Maven:
a. Download binary zip archive from https://maven.apache.org/download.cgi
b. Unpack to C:\msys64\usr\local
pacman -Syu
and confirm at the prompts.Install dependencies. During installation, use default=all by leaving the input blank and pressing enter.
64-bit: pacman -S mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake git mingw-w64-x86_64-icu
32-bit: pacman -S mingw-w64-i686-toolchain make mingw-w64-i686-cmake git mingw-w64-i686-icu
curl -s "https://get.sdkman.io" | bash
sdk install java 21.0.2.fx-librca
export MAVEN_HOME=/usr/local/apache-maven-3.x.x/
export PATH=$PATH:$JAVA_HOME/bin/:$MAVEN_HOME/bin/
git clone --recurse-submodules https://github.com/woodser/monero-java.git
cd ./monero-java
mvn install
./bin/build_libmonero_java.sh
After building the native libraries to the ./build folder, add them to PATH
, your application's classpath, or explictly load them in Java by calling:
System.load(/absolute/path/to/libmonero-cpp.dll);
System.load(/absolute/path/to/libmonero-java.dll);
Alternatively, you can bundle the libraries into monero-java's JAR:
mvn install
mvn clean install -U
You can verify the native libraries are working by running TestMoneroUtils.java.
If you see unrestricted memory growth using native bindings, consider applying jemalloc to improve memory management with malloc
. In many cases, this can completely resolve the memory growth.
For example: export LD_PRELOAD=/path/to/libjemalloc.a
then run your app.
git clone --recurse-submodules https://github.com/woodser/monero-java.git
cd monero-java
./monerod --stagenet
(or use a remote daemon)../monero-wallet-rpc --daemon-address http://localhost:38081 --stagenet --rpc-bind-port 38083 --rpc-login rpc_user:abc123 --wallet-dir ./
This project is licensed under MIT.
Please consider donating to support the development of this project. 🙏
46FR1GKVqFNQnDiFkH7AuzbUBrGQwz2VdaXTDD4jcjRE8YkkoTYTmZ2Vohsz9gLSqkj5EM6ai9Q7sBoX4FPPYJdGKQQXPVz