feat(android-ffi): viewer-core 的 JNI 薄层,arm64 交叉编译通过(QUIC 栈上手机的第一道关)
方案变更说明(A2 落地修正):原裁决选 UniFFI,但实查 Maven Central 与 maven.mozilla.org 均无 uniffi Kotlin 运行时构件(404),自编译发布成本超过收益。 改为裸 JNI:阶段 0(真机)已验证该链路,接口刻意保持窄(连接/取帧/发输入/销毁), 将来若引入 UniFFI 只替换本层。 线程与锁纪律(决定接口形态): - nativeNextFrame 等帧期间不持会话锁(clone Arc<Session> 后即释放), 桌面静止 500ms 帧间隔不会卡住 UI 线程的输入调用 - destroy 前必须先停解码线程,Kotlin 侧顺序纪律保证(已登记风险清单) - 句柄 = Box 裸指针(永不为 0),destroy 后置 0 帧返回约定:byte[] = [keyframe 标志 1][seq 8][ts 8][w 4][h 4][Annex-B payload], 定长 25 字节头,Kotlin 切片零 JNI 往返。 viewer-core 适配:Session.frames 改 Arc<tokio Mutex>,next_frame 取 &self, 使解码线程与输入线程可并发借用同一 Session。 验证: - 桌面 cargo build -p android-ffi 零警告 - cargo ndk -t arm64-v8a --release:quinn/ring/rustls 交叉编译全部通过 (消除阶段 1 最大未知:QUIC 栈能否编到 Android) - libandroidffi.so 4.2MB,10 个 Java_com_verify_remote_RustBridge_* 符号导出正确
This commit is contained in:
1 parent
34df7b070b
commit
44767ed370
5 files changed
+473
-21
No files matched your search
@@ -149,7 +149,9 @@ enum Command {
|
||||
pub struct Session {
|
||||
tx: mpsc::UnboundedSender<Command>,
|
||||
/// 帧接收端。通道关闭 = 会话结束(被控端断开或流错误)。
|
||||
frames: mpsc::Receiver<Frame>,
|
||||
/// Mutex 包一层是为了让 `next_frame` 取 `&self`:JNI 层里解码线程独占 recv,
|
||||
/// 输入线程并发调 `send_input`(走无锁的 unbounded tx),两者互不阻塞。
|
||||
frames: Arc<tokio::sync::Mutex<mpsc::Receiver<Frame>>>,
|
||||
stats: Arc<std::sync::Mutex<SessionStats>>,
|
||||
/// 保持 Endpoint 存活(drop 会销毁连接)
|
||||
_endpoint: quinn::Endpoint,
|
||||
@@ -313,7 +315,7 @@ impl Session {
|
||||
|
||||
Ok(Self {
|
||||
tx: cmd_tx,
|
||||
frames,
|
||||
frames: Arc::new(tokio::sync::Mutex::new(frames)),
|
||||
stats,
|
||||
_endpoint: endpoint,
|
||||
conn,
|
||||
@@ -321,8 +323,9 @@ impl Session {
|
||||
}
|
||||
|
||||
/// 取下一帧。`None` = 会话结束。
|
||||
pub async fn next_frame(&mut self) -> Option<Frame> {
|
||||
self.frames.recv().await
|
||||
/// `&self`:JNI 层里解码线程独占 recv,输入线程可并发 `send_input`。
|
||||
pub async fn next_frame(&self) -> Option<Frame> {
|
||||
self.frames.lock().await.recv().await
|
||||
}
|
||||
|
||||
/// 发送一个输入事件(非阻塞入队,由写任务串行发出)。
|
||||
|
||||
Reference in new issue
Block a user