diff --git a/Cargo.toml b/Cargo.toml index 0889ffe..a931362 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,8 @@ percent-encoding = "2" serde = { version = "1", features = ["derive"] } shlex = "1.3.0" socks5-impl = { version = "0.8", default-features = false, features = [ - "tokio", "serde" + "tokio", + "serde", ] } thiserror = "2" tokio = { version = "1", features = ["full"] } @@ -58,7 +59,7 @@ url = "2" [target.'cfg(target_os="android")'.dependencies] android_logger = "0.15" -jni = { version = "0.21", default-features = false } +jni = { version = "0.22.3", default-features = false } [target.'cfg(target_os="linux")'.dependencies] bincode = "2" @@ -68,7 +69,7 @@ windows-service = "0.8" [target.'cfg(unix)'.dependencies] daemonize = "0.5" -nix = { version = "0.30", default-features = false, features = [ +nix = { version = "0.31", default-features = false, features = [ "fs", "socket", "uio", diff --git a/src/android.rs b/src/android.rs index 030e921..837485c 100644 --- a/src/android.rs +++ b/src/android.rs @@ -6,7 +6,7 @@ use crate::{ error::{Error, Result}, }; use jni::{ - JNIEnv, + Env, EnvUnowned, objects::{JClass, JString}, sys::{jboolean, jchar, jint}, }; @@ -23,9 +23,9 @@ use jni::{ /// - verbosity: the verbosity level, see ArgVerbosity enum #[unsafe(no_mangle)] pub unsafe extern "C" fn Java_com_github_shadowsocks_bg_Tun2proxy_run( - mut env: JNIEnv, - _clazz: JClass, - proxy_url: JString, + mut env: EnvUnowned<'_>, + _clazz: JClass<'_>, + proxy_url: JString<'_>, tun_fd: jint, close_fd_on_drop: jboolean, tun_mtu: jchar, @@ -42,27 +42,30 @@ pub unsafe extern "C" fn Java_com_github_shadowsocks_bg_Tun2proxy_run( .with_max_level(log::LevelFilter::Trace) .with_filter(filter), ); - let proxy_url = get_java_string(&mut env, &proxy_url).unwrap(); - let proxy = ArgProxy::try_from(proxy_url.as_str()).unwrap(); - let close_fd_on_drop = close_fd_on_drop != 0; + env.with_env(|env: &mut Env| -> Result { + let proxy_url = get_java_string(env, &proxy_url).unwrap(); + let proxy = ArgProxy::try_from(proxy_url.as_str()).unwrap(); - let mut args = Args::default(); - args.proxy(proxy) - .tun_fd(Some(tun_fd)) - .close_fd_on_drop(close_fd_on_drop) - .dns(dns) - .verbosity(verbosity); - crate::general_api::general_run_for_api(args, tun_mtu, false) + let mut args = Args::default(); + args.proxy(proxy) + .tun_fd(Some(tun_fd)) + .close_fd_on_drop(close_fd_on_drop) + .dns(dns) + .verbosity(verbosity); + let v = crate::general_api::general_run_for_api(args, tun_mtu, false); + Ok::(v) + }) + .resolve::() } /// # Safety /// /// Shutdown tun2proxy #[unsafe(no_mangle)] -pub unsafe extern "C" fn Java_com_github_shadowsocks_bg_Tun2proxy_stop(_env: JNIEnv, _: JClass) -> jint { +pub unsafe extern "C" fn Java_com_github_shadowsocks_bg_Tun2proxy_stop(_env: EnvUnowned<'_>, _: JClass<'_>) -> jint { crate::general_api::tun2proxy_stop_internal() } -fn get_java_string(env: &mut JNIEnv, string: &JString) -> Result { - Ok(env.get_string(string)?.into()) +fn get_java_string(env: &Env, string: &JString) -> Result { + string.try_to_string(env).map_err(|e| e.into()) }