复用连接
This commit is contained in:
@@ -2,30 +2,14 @@ package net.bluemangoo.indpjsk.vpn
|
||||
|
||||
import android.util.Log
|
||||
|
||||
/**
|
||||
* Rust core_vpn 的 JNI 桥。
|
||||
*
|
||||
* 契约(由 Rust lib.rs 实现):
|
||||
* runCapture(jint tunFd, jstring targetHosts, jstring path, jstring savePath, jstring proxy) -> String?
|
||||
* - 阻塞直到抓包结束
|
||||
* - tunFd 的所有权【仍在 Kotlin 侧】,Rust 内部用 BorrowedAsyncDevice 借用,不得 close()
|
||||
* - targetHosts 是逗号分隔的域名白名单(一个步骤可能对应多个上游域名)
|
||||
* - proxy 可为 null / 空串(直连),否则必须是 http(s)://host:port 形式,Rust 侧会再校验一次
|
||||
* - 返回非 null = 抓到目标请求,值是命中的原始完整 URL(https://host/path?query),文件已写入 savePath
|
||||
* - 返回 null = 失败 / 被 requestStop 打断 / 未匹配
|
||||
*
|
||||
* requestStop() -> void
|
||||
* - 立即返回,仅设置原子停止标志,使阻塞中的 runCapture 尽快返回 false
|
||||
*
|
||||
* nativeLog(String)(Kotlin -> Rust 回调的落地端)
|
||||
* - Rust 通过 JNIEnv.call_static_method(".../VpnBridge", "nativeLog", ...) 调用
|
||||
* - 用于把 TLS 握手 / 匹配结果等关键日志写进 UI 日志框
|
||||
*/
|
||||
object VpnBridge {
|
||||
|
||||
private const val TAG = "VpnBridge"
|
||||
private var loaded = false
|
||||
|
||||
@Volatile
|
||||
var stepListener: ((String, String?) -> Unit)? = null
|
||||
|
||||
init {
|
||||
loaded = try {
|
||||
System.loadLibrary("core_vpn")
|
||||
@@ -39,19 +23,19 @@ object VpnBridge {
|
||||
fun isAvailable(): Boolean = loaded
|
||||
|
||||
@JvmStatic
|
||||
external fun runCapture(
|
||||
tunFd: Int,
|
||||
targetHosts: String,
|
||||
targetPath: String,
|
||||
savePath: String,
|
||||
proxy: String?
|
||||
): String?
|
||||
external fun boot(tunFd: Int, stepsJson: String, proxy: String?): Boolean
|
||||
|
||||
@JvmStatic
|
||||
external fun requestStop()
|
||||
external fun stopSession()
|
||||
|
||||
@JvmStatic
|
||||
external fun shutdownSession()
|
||||
|
||||
@JvmStatic
|
||||
fun nativeStepResult(stepId: String, url: String?) {
|
||||
stepListener?.invoke(stepId, url)
|
||||
}
|
||||
|
||||
/** 供 Rust JNI 回调写入日志框;Rust 侧通过 call_static_method 调用本方法 */
|
||||
@Suppress("unused")
|
||||
@JvmStatic
|
||||
fun nativeLog(level: String, msg: String) {
|
||||
when (level) {
|
||||
@@ -61,4 +45,4 @@ object VpnBridge {
|
||||
else -> VpnLog.info(msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user