From 6d86b2cf16f0e316e52ec1293b5fcad391ad6bff Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 11 Feb 2019 16:20:11 +0000 Subject: [PATCH] Extract rust_vec_to_java() utility function --- src/main/rust/lib.rs | 23 ++++++++++------------- src/main/rust/utils.rs | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/main/rust/lib.rs b/src/main/rust/lib.rs index a2a34040..c3a574b4 100644 --- a/src/main/rust/lib.rs +++ b/src/main/rust/lib.rs @@ -9,7 +9,7 @@ const SAPLING_CONSENSUS_BRANCH_ID: u32 = 0x76b8_09bb; use android_logger::Filter; use jni::{ objects::{JClass, JString}, - sys::{jboolean, jbyteArray, jint, jlong, jobjectArray, jsize, jstring, JNI_FALSE, JNI_TRUE}, + sys::{jboolean, jbyteArray, jint, jlong, jobjectArray, jstring, JNI_FALSE, JNI_TRUE}, JNIEnv, }; use log::Level; @@ -97,21 +97,18 @@ pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_JniConverter_initAccountsTab vec![] }; - let jempty = env.new_string("").expect("Couldn't create Java string!"); - let jret = env - .new_object_array(ret.len() as jsize, "java/lang/String", *jempty) - .expect("Couldn't create Java array!"); - for (i, extsk) in ret.into_iter().enumerate() { - let jextsk = env - .new_string(encode_extended_spending_key( + utils::rust_vec_to_java( + &env, + ret, + "java/lang/String", + |env, extsk| { + env.new_string(encode_extended_spending_key( HRP_SAPLING_EXTENDED_SPENDING_KEY_TEST, &extsk, )) - .expect("Couldn't create Java string!"); - env.set_object_array_element(jret, i as jsize, *jextsk) - .expect("Couldn't set Java array element!"); - } - jret + }, + |env| env.new_string(""), + ) } #[no_mangle] diff --git a/src/main/rust/utils.rs b/src/main/rust/utils.rs index b519be74..6e4f7b91 100644 --- a/src/main/rust/utils.rs +++ b/src/main/rust/utils.rs @@ -1,7 +1,39 @@ -use jni::{objects::JString, JNIEnv}; +use jni::{ + descriptors::Desc, + errors::Result as JNIResult, + objects::{JClass, JObject, JString}, + sys::{jobjectArray, jsize}, + JNIEnv, +}; +use std::ops::Deref; pub(crate) fn java_string_to_rust(env: &JNIEnv<'_>, jstring: JString<'_>) -> String { env.get_string(jstring) .expect("Couldn't get Java string!") .into() } + +pub(crate) fn rust_vec_to_java<'a, T, U, V, F, G>( + env: &JNIEnv<'a>, + data: Vec, + element_class: U, + element_map: F, + empty_element: G, +) -> jobjectArray +where + U: Desc<'a, JClass<'a>>, + V: Deref>, + F: Fn(&JNIEnv<'a>, T) -> JNIResult, + G: Fn(&JNIEnv<'a>) -> JNIResult, +{ + let jempty = empty_element(env).expect("Couldn't create Java string!"); + let jret = env + .new_object_array(data.len() as jsize, element_class, *jempty) + .expect("Couldn't create Java array!"); + for (i, elem) in data.into_iter().enumerate() { + let jelem = element_map(env, elem).expect("Couldn't map element to Java!"); + env.set_object_array_element(jret, i as jsize, *jelem) + .expect("Couldn't set Java array element!"); + } + jret +}