1.0 能用
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
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) -> String?
|
||||
* - 阻塞直到抓包结束
|
||||
* - tunFd 的所有权【仍在 Kotlin 侧】,Rust 内部用 BorrowedAsyncDevice 借用,不得 close()
|
||||
* - targetHosts 是逗号分隔的域名白名单(一个步骤可能对应多个上游域名)
|
||||
* - 返回非 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
|
||||
|
||||
init {
|
||||
loaded = try {
|
||||
System.loadLibrary("core_vpn")
|
||||
true
|
||||
} catch (t: Throwable) {
|
||||
Log.e(TAG, "loadLibrary core_vpn failed", t)
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fun isAvailable(): Boolean = loaded
|
||||
|
||||
@JvmStatic
|
||||
external fun runCapture(
|
||||
tunFd: Int,
|
||||
targetHosts: String,
|
||||
targetPath: String,
|
||||
savePath: String
|
||||
): String?
|
||||
|
||||
@JvmStatic
|
||||
external fun requestStop()
|
||||
|
||||
/** 供 Rust JNI 回调写入日志框;Rust 侧通过 call_static_method 调用本方法 */
|
||||
@Suppress("unused")
|
||||
@JvmStatic
|
||||
fun nativeLog(level: String, msg: String) {
|
||||
when (level) {
|
||||
"error" -> VpnLog.error(msg)
|
||||
"warn" -> VpnLog.warn(msg)
|
||||
"info" -> VpnLog.info(msg)
|
||||
else -> VpnLog.info(msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user