ergowalletlibjni/
lib.rs

1//! JNI bindings fo ergo-lib
2
3// Coding conventions
4#![deny(non_upper_case_globals)]
5#![deny(non_camel_case_types)]
6#![deny(non_snake_case)]
7#![deny(unused_mut)]
8#![deny(dead_code)]
9#![deny(unused_imports)]
10// #![deny(missing_docs)]
11#![allow(clippy::missing_safety_doc)]
12
13#[macro_use]
14extern crate log;
15
16mod exception;
17
18use ergo_lib_c_core::address::{address_delete, address_from_testnet, AddressPtr};
19use exception::unwrap_exc_or;
20use jni::{
21    objects::{JClass, JString},
22    sys::jlong,
23    JNIEnv,
24};
25use std::{panic, ptr::null_mut};
26
27#[no_mangle]
28pub unsafe extern "system" fn Java_org_ergoplatform_wallet_jni_WalletLib_addressFromTestNet(
29    env: JNIEnv,
30    _: JClass,
31    address_str: JString,
32) -> jlong {
33    let res = panic::catch_unwind(|| {
34        let address_str_j = env
35            .get_string(address_str)
36            .expect("Couldn't get address String");
37
38        let mut address: AddressPtr = null_mut();
39        let result = address_from_testnet(&address_str_j.to_string_lossy(), &mut address);
40
41        if let Some(error) = result.err() {
42            let _ = env.throw(error.to_string());
43            Ok(0)
44        } else {
45            Ok(address as jlong)
46        }
47    });
48    unwrap_exc_or(&env, res, 0)
49}
50
51#[no_mangle]
52pub unsafe extern "system" fn Java_org_ergoplatform_wallet_jni_WalletLib_addressDelete(
53    _: JNIEnv,
54    _: JClass,
55    address: jlong,
56) {
57    let address_ptr: AddressPtr = address as AddressPtr;
58    if !address_ptr.is_null() {
59        address_delete(address_ptr);
60    }
61}