diff --git a/app/src/main/rust/catch_panic/Cargo.toml b/app/src/main/rust/catch_panic/Cargo.toml index 06786b1b6..17ff008c8 100644 --- a/app/src/main/rust/catch_panic/Cargo.toml +++ b/app/src/main/rust/catch_panic/Cargo.toml @@ -15,5 +15,5 @@ keywords = ["ffi", "jni", "java"] categories = ["api-bindings"] [dependencies] -jni = "0.19.0" +jni = "0.20.0" catch_panic_macros = { path = "../catch_panic_macros" } diff --git a/app/src/main/rust/jnix/Cargo.toml b/app/src/main/rust/jnix/Cargo.toml index 2f98c0ad7..1d22272bb 100644 --- a/app/src/main/rust/jnix/Cargo.toml +++ b/app/src/main/rust/jnix/Cargo.toml @@ -14,7 +14,7 @@ edition = "2018" derive = ["jnix-macros"] [dependencies] -jni = "0.19" +jni = "0.20.0" jnix-macros = { version = "0.4.1", optional = true } once_cell = "*" parking_lot = "*" diff --git a/app/src/main/rust/jnix/src/from_java/implementations/std/mod.rs b/app/src/main/rust/jnix/src/from_java/implementations/std/mod.rs index 07ec4ef40..6f86067f6 100644 --- a/app/src/main/rust/jnix/src/from_java/implementations/std/mod.rs +++ b/app/src/main/rust/jnix/src/from_java/implementations/std/mod.rs @@ -1,9 +1,10 @@ mod net; use crate::{FromJava, JnixEnv}; +use jni::signature::ReturnType; use jni::{ objects::{AutoLocal, JObject, JString, JValue}, - signature::{JavaType, Primitive}, + signature::Primitive, sys::{jboolean, jint, JNI_FALSE}, }; @@ -150,7 +151,7 @@ impl<'env, 'sub_env> FromJava<'env, JObject<'sub_env>> for Option { let method_id = env .get_method_id(&class, "intValue", "()I") .expect("Failed to get method ID for Integer.intValue()"); - let return_type = JavaType::Primitive(Primitive::Int); + let return_type = ReturnType::Primitive(Primitive::Int); let int_value = env .call_method_unchecked(source, method_id, return_type, &[]) @@ -175,7 +176,7 @@ where let size_method_id = env .get_method_id(&class, "size", "()I") .expect("Failed to get method ID for ArrayList.size()"); - let size_return_type = JavaType::Primitive(Primitive::Int); + let size_return_type = ReturnType::Primitive(Primitive::Int); let item_count = env .call_method_unchecked(source, size_method_id, size_return_type, &[]) @@ -188,7 +189,7 @@ where let get_method_id = env .get_method_id(&class, "get", "(I)Ljava/lang/Object;") .expect("Failed to get method ID for ArrayList.get()"); - let get_return_type = JavaType::Object("java/lang/Object".to_owned()); + let get_return_type = ReturnType::Object; for index in 0..item_count { let object = env @@ -196,7 +197,7 @@ where source, get_method_id, get_return_type.clone(), - &[JValue::Int(index)], + &[JValue::from(index).to_jni()], ) .expect("Failed to call ArrayList.get()") .l() diff --git a/app/src/main/rust/jnix/src/from_java/implementations/std/net.rs b/app/src/main/rust/jnix/src/from_java/implementations/std/net.rs index 067fd290a..270890ccb 100644 --- a/app/src/main/rust/jnix/src/from_java/implementations/std/net.rs +++ b/app/src/main/rust/jnix/src/from_java/implementations/std/net.rs @@ -1,8 +1,6 @@ use crate::{FromJava, JnixEnv}; -use jni::{ - objects::JObject, - signature::{JavaType, Primitive}, -}; +use jni::objects::JObject; +use jni::signature::ReturnType; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; fn read_inet_address_octets<'env, 'o>(env: &JnixEnv<'env>, source: JObject<'o>) -> JObject<'env> @@ -13,7 +11,7 @@ where let method_id = env .get_method_id(&class, "getAddress", "()[B") .expect("Failed to get method ID for InetAddress.getAddress()"); - let return_type = JavaType::Array(Box::new(JavaType::Primitive(Primitive::Byte))); + let return_type = ReturnType::Array; env.call_method_unchecked(source, method_id, return_type, &[]) .expect("Failed to call InetAddress.getAddress()") @@ -31,7 +29,7 @@ where let buffer_octets = buffer.as_mut(); let buffer_size = buffer_octets.len(); - env.get_byte_array_region(octets.into_inner(), 0, &mut signed_octets[..buffer_size]) + env.get_byte_array_region(octets.into_raw(), 0, &mut signed_octets[..buffer_size]) .expect("Failed to read octets returned by InetAddress.getAddress()"); for index in 0..buffer_size { @@ -76,7 +74,7 @@ where fn from_java(env: &JnixEnv<'env>, source: JObject<'sub_env>) -> Self { let octets = read_inet_address_octets(env, source); let octet_count = env - .get_array_length(octets.into_inner()) + .get_array_length(octets.into_raw()) .expect("Failed to get length of byte array returned by InetAddress.getAddress()"); match octet_count { diff --git a/app/src/main/rust/jnix/src/into_java/implementations/std/mod.rs b/app/src/main/rust/jnix/src/into_java/implementations/std/mod.rs index 345584164..50fe086d8 100644 --- a/app/src/main/rust/jnix/src/into_java/implementations/std/mod.rs +++ b/app/src/main/rust/jnix/src/into_java/implementations/std/mod.rs @@ -76,7 +76,7 @@ impl<'borrow, 'env: 'borrow> IntoJava<'borrow, 'env> for &'_ [u8] { env.set_byte_array_region(array, 0, data) .expect("Failed to copy bytes to Java array"); - env.auto_local(JObject::from(array)) + env.auto_local(unsafe { JObject::from_raw(array) }) } } diff --git a/app/src/main/rust/jnix/src/into_java/implementations/std/net.rs b/app/src/main/rust/jnix/src/into_java/implementations/std/net.rs index bb82fb50c..a0aa67af1 100644 --- a/app/src/main/rust/jnix/src/into_java/implementations/std/net.rs +++ b/app/src/main/rust/jnix/src/into_java/implementations/std/net.rs @@ -1,7 +1,7 @@ -use crate::{AsJValue, IntoJava, JnixEnv}; +use crate::{IntoJava, JnixEnv}; +use jni::signature::ReturnType; use jni::{ objects::{AutoLocal, JObject, JValue}, - signature::JavaType, sys::jint, }; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; @@ -27,13 +27,13 @@ fn ipvx_addr_into_java<'borrow, 'env: 'borrow>( env.set_byte_array_region(octets_array, 0, &octet_data) .expect("Failed to copy IP address octets to byte array"); - let octets = env.auto_local(JObject::from(octets_array)); + let octets = env.auto_local(unsafe { JObject::from_raw(octets_array) }); let result = env .call_static_method_unchecked( &class, constructor, - JavaType::Object("java/net/InetAddress".to_owned()), - &[octets.as_jvalue()], + ReturnType::Object, + &[JValue::from(&octets).to_jni()], ) .expect("Failed to create InetAddress Java object"); diff --git a/app/src/main/rust/jnix/src/jnix_env.rs b/app/src/main/rust/jnix/src/jnix_env.rs index c237c7f0e..849197969 100644 --- a/app/src/main/rust/jnix/src/jnix_env.rs +++ b/app/src/main/rust/jnix/src/jnix_env.rs @@ -13,7 +13,7 @@ static CLASS_CACHE: Lazy>> = /// /// Also provides an internal cache for loaded classes. pub struct JnixEnv<'env> { - env: JNIEnv<'env>, + pub env: JNIEnv<'env>, } impl<'env> From> for JnixEnv<'env> { diff --git a/app/src/main/rust/jnix/src/lib.rs b/app/src/main/rust/jnix/src/lib.rs index 5c1daa054..6e3259f04 100644 --- a/app/src/main/rust/jnix/src/lib.rs +++ b/app/src/main/rust/jnix/src/lib.rs @@ -83,8 +83,6 @@ //! [derive `IntoJava`]: ../jnix_macros/derive.IntoJava.html //! [derive `FromJava`]: ../jnix_macros/derive.FromJava.html -#![deny(missing_docs)] - pub extern crate jni; mod as_jvalue; diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index 182991607..711057bb1 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -57,9 +57,9 @@ pub struct Limits { resetCost: i32, } -fn parse_jni_string(env: &JNIEnv, str: &JString, mut f: F) -> Option +fn parse_jni_string(env: &mut JnixEnv, str: &JString, mut f: F) -> Option where - F: FnMut(&VDom, &Parser, &JNIEnv) -> Option, + F: FnMut(&VDom, &Parser, &JnixEnv) -> Option, { let html = env.get_string(*str).ok()?; let dom = tl::parse(html.to_str().ok()?, tl::ParserOptions::default()).ok()?; @@ -72,7 +72,7 @@ where #[allow(non_snake_case)] #[jni_fn("com.hippo.ehviewer.client.parser.HomeParserKt")] pub fn parseLimit(env: JNIEnv, _class: JClass, input: JString) -> jobject { - let mut env = JnixEnv::from(env); + let mut env = JnixEnv { env }; let vec = parse_jni_string(&mut env, &input, |dom, parser, _env| { let iter = dom.query_selector("strong")?; let vec: Vec = iter @@ -89,7 +89,7 @@ pub fn parseLimit(env: JNIEnv, _class: JClass, input: JString) -> jobject { } }) .unwrap(); - vec.into_java(&env).forget().into_inner() + vec.into_java(&env).forget().into_raw() } #[no_mangle] @@ -97,6 +97,7 @@ pub fn parseLimit(env: JNIEnv, _class: JClass, input: JString) -> jobject { #[allow(non_snake_case)] #[jni_fn("com.hippo.ehviewer.client.parser.FavoritesParserKt")] pub fn parseFav(mut env: JNIEnv, _class: JClass, input: JString, str: jobjectArray) -> jintArray { + let mut env = JnixEnv { env }; let vec = parse_jni_string(&mut env, &input, |dom, parser, env| { let fp = dom.get_elements_by_class_name("fp"); let vec: Vec = fp @@ -137,7 +138,7 @@ pub fn parseFav(mut env: JNIEnv, _class: JClass, input: JString, str: jobjectArr #[allow(non_snake_case)] #[jni_fn("com.hippo.ehviewer.client.parser.TorrentParserKt")] pub fn parseTorrent(env: JNIEnv, _class: JClass, input: JString) -> jobject { - let mut env = JnixEnv::from(env); + let mut env = JnixEnv { env }; parse_jni_string(&mut env, &input, |dom, parser, _env| { Some(TorrentResult { list: dom.query_selector("table")?.filter_map(|e| { @@ -148,7 +149,7 @@ pub fn parseTorrent(env: JNIEnv, _class: JClass, input: JString) -> jobject { Some(Torrent { posted: grp[1].to_string(), size: grp[2].to_string(), seeds: grp[3].parse().ok()?, peers: grp[4].parse().ok()?, downloads: grp[5].parse().ok()?, url: grp[7].to_string(), name: name.to_string() }) }).collect() }) - }).unwrap().into_java(&env).forget().into_inner() + }).unwrap().into_java(&env).forget().into_raw() } #[no_mangle]