From bf2458d464ecc6930cf3bfdf1bc79bdf336b2f6b Mon Sep 17 00:00:00 2001 From: lbl <1791778603@qq.com> Date: Thu, 20 Aug 2026 21:57:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20JNI=20=E5=BB=BA=E7=BD=91?= =?UTF-8?q?=E5=90=8E=20TaskGroupGuard=20=E8=A2=AB=E7=AB=8B=E5=8D=B3=20drop?= =?UTF-8?q?=20=E5=AF=BC=E8=87=B4=E7=BD=91=E7=BB=9C=E5=BB=BA=E5=AE=8C?= =?UTF-8?q?=E5=8D=B3=E6=AD=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TaskGroupGuard drop 会停止整个任务组且后续 spawn 静默失败。此前 nativeCreateNetwork 中 guard 在闭包结束即被释放:注册虽返回成功, 但数据处理任务根本不会启动,VPN 完全不通。 - GlobalState 增加 task_group_guards,guard 随实例持有 - nativeStop 中最后释放 guard;nativeDestroy 整体析构时随之释放 --- vnt-jni/src/lib.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/vnt-jni/src/lib.rs b/vnt-jni/src/lib.rs index 29ea896..514af30 100644 --- a/vnt-jni/src/lib.rs +++ b/vnt-jni/src/lib.rs @@ -14,7 +14,7 @@ use vnt_core::nat::NetInput; use vnt_core::port_mapping::PortMapping; use vnt_core::tls::verifier::CertValidationMode; use vnt_core::tunnel_core::server::transport::config::ProtocolAddress; -use vnt_core::utils::task_control::TaskGroupManager; +use vnt_core::utils::task_control::{TaskGroupGuard, TaskGroupManager}; /// 全局状态管理 struct GlobalState { @@ -26,6 +26,8 @@ struct GlobalState { vnt_apis: HashMap, /// 任务组管理器 task_group_managers: HashMap, + /// 任务组守卫(drop 时会停止任务组,必须持有到 nativeStop) + task_group_guards: HashMap, /// 下一个实例ID next_id: i64, } @@ -37,6 +39,7 @@ impl GlobalState { network_managers: HashMap::new(), vnt_apis: HashMap::new(), task_group_managers: HashMap::new(), + task_group_guards: HashMap::new(), next_id: 1, }) } @@ -93,7 +96,7 @@ pub extern "system" fn Java_com_vnt_VntManager_nativeCreateNetwork<'local>( // 创建任务组 let task_group_manager = TaskGroupManager::new(); - let (task_group, _task_group_guard) = task_group_manager + let (task_group, task_group_guard) = task_group_manager .create_task() .context("create task group")?; @@ -109,11 +112,12 @@ pub extern "system" fn Java_com_vnt_VntManager_nativeCreateNetwork<'local>( let id = state.next_id; state.next_id += 1; - // 保存实例 + // 保存实例(task_group_guard 必须随实例一直持有,drop 会停止整个任务组) state .network_managers .insert(id, Arc::new(Mutex::new(Some(network_manager)))); state.task_group_managers.insert(id, task_group_manager); + state.task_group_guards.insert(id, task_group_guard); Ok(id) })(); @@ -397,6 +401,8 @@ pub extern "system" fn Java_com_vnt_VntNetwork_nativeStop( state.network_managers.remove(&handle); state.vnt_apis.remove(&handle); state.task_group_managers.remove(&handle); + // 最后释放守卫(drop 时会停止任务组) + state.task_group_guards.remove(&handle); Ok(()) })();