From f28db050fb0f2cf214f3def3db537c67f68e9523 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=83=91=E5=8D=9A=E6=96=87?= <1323515022@qq.com>
Date: Sat, 31 Oct 2026 13:29:48 +0800
Subject: [PATCH] =?UTF-8?q?feat(android-ffi):=20nativeLastErrorKind=20?=
=?UTF-8?q?=E5=87=BA=E5=8F=A3=E5=B8=A6=E9=94=99=E8=AF=AF=E5=88=86=E7=B1=BB?=
=?UTF-8?q?=EF=BC=883a=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
LAST_ERROR 槽位改存 (kind, detail),新增 nativeLastErrorKind();FFI 契约
kind 先取、message 后取(消息读走清空槽位)。kind 编号与 viewer_core::
ConnectErrorKind::code 一致,跨 FFI 只传整数。JNI 符号 12→13 全部导出(字节扫描核)。
---
android-ffi/src/lib.rs | 55 +++++++++++++++++++++++++++++-------------
1 file changed, 38 insertions(+), 17 deletions(-)
diff --git a/android-ffi/src/lib.rs b/android-ffi/src/lib.rs
index d283387..09e0f0e 100644
--- a/android-ffi/src/lib.rs
+++ b/android-ffi/src/lib.rs
@@ -34,7 +34,8 @@ struct SessionBox {
runtime: tokio::runtime::Runtime,
}
-/// 连接被控端。成功返回句柄(>0),失败返回 0;错误消息经 `nativeLastError()` 取。
+/// 连接被控端。成功返回句柄(>0),失败返回 0;错误消息经 `nativeLastError()` 取,
+/// **错误分类**经 `nativeLastErrorKind()` 取(3a:界面按分类显示中文文案,原始英文作第二行)。
#[no_mangle]
pub extern "system" fn Java_com_verify_remote_RustBridge_nativeConnect<'local>(
mut env: JNIEnv<'local>,
@@ -46,14 +47,14 @@ pub extern "system" fn Java_com_verify_remote_RustBridge_nativeConnect<'local>(
let host_s = match env.get_string(&host) {
Ok(s) => s.to_string_lossy().into_owned(),
Err(_) => {
- set_last_error("host 参数不是合法字符串");
+ set_last_error(-1, "host 参数不是合法字符串");
return 0;
}
};
let code_s = match env.get_string(&code) {
Ok(s) => s.to_string_lossy().into_owned(),
Err(_) => {
- set_last_error("code 参数不是合法字符串");
+ set_last_error(-1, "code 参数不是合法字符串");
return 0;
}
};
@@ -64,7 +65,7 @@ pub extern "system" fn Java_com_verify_remote_RustBridge_nativeConnect<'local>(
.build()
{
Ok(r) => r,
- Err(e) => return Err(format!("runtime init: {e}")),
+ Err(e) => return Err((-1i32, format!("runtime init: {e}"))),
};
let cfg = ConnectConfig::direct(host_s, port as u16, code_s);
match runtime.block_on(Session::connect(cfg)) {
@@ -72,53 +73,73 @@ pub extern "system" fn Java_com_verify_remote_RustBridge_nativeConnect<'local>(
session: Arc::new(session),
runtime,
}),
- Err(e) => Err(format!("{e:#}")),
+ // ConnectError 的 Display 即原始 detail;kind.code() 与
+ // viewer_core::ConnectErrorKind::code 的映射表一致(FFI 契约)。
+ Err(e) => Err((e.kind.code(), e.detail)),
}
});
match built {
Ok(Ok(boxed)) => {
- set_last_error("");
+ set_last_error(0, "");
Box::into_raw(Box::new(Mutex::new(boxed))) as jlong
}
- Ok(Err(msg)) => {
- set_last_error(&msg);
+ Ok(Err((kind, msg))) => {
+ set_last_error(kind, &msg);
0
}
Err(_) => {
- set_last_error("panic in nativeConnect");
+ set_last_error(-1, "panic in nativeConnect");
0
}
}
}
-fn set_last_error(msg: &str) {
+/// kind = 0 表示清除;-1 表示 FFI 层自身错误(无 viewer-core 分类,Kotlin 走 Other 文案)。
+fn set_last_error(kind: i32, msg: &str) {
let mut slot = LAST_ERROR.lock().unwrap();
if msg.is_empty() {
*slot = None;
} else {
- *slot = Some(msg.to_string());
+ *slot = Some((kind, msg.to_string()));
}
}
-static LAST_ERROR: Mutex