方案变更说明(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_* 符号导出正确
21 lines
753 B
TOML
21 lines
753 B
TOML
[package]
|
||
name = "android-ffi"
|
||
version = "0.1.0"
|
||
edition = "2021"
|
||
|
||
# 安卓主控的 JNI 薄层:把 viewer-core 的异步 Session 包成 Kotlin 可同步调用的句柄。
|
||
# 2026-10-29 裁决变更:原方案 A2 选 UniFFI,但其实训运行时不在 Maven Central /
|
||
# Mozilla maven(查证 404),需自编译发布,成本超过收益。改为裸 JNI——阶段 0
|
||
# (D:\working\android\phase0)已验证该链路真机可跑。接口刻意保持窄(连接/取帧/
|
||
# 发输入/销毁),将来若引入 UniFFI 也只是替换本层。
|
||
[lib]
|
||
name = "androidffi"
|
||
crate-type = ["cdylib"]
|
||
|
||
[dependencies]
|
||
viewer-core = { path = "../viewer-core" }
|
||
common = { path = "../common" }
|
||
anyhow.workspace = true
|
||
tokio.workspace = true
|
||
jni = "0.21"
|