ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

30 行代码接入 ZeroTier Android SDK

30 行代码接入 ZeroTier Android SDK 30 行代码接入 ZeroTier Android SDK【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne想让 App 里的设备绕开公网、像同一局域网那样直接对话这篇带你把 ZeroTier Android SDK 一次跑通适合准备集成虚拟组网能力的 Android 工程师。 机制速览三层结构到底在干嘛先给结论ZeroTier SDK 是典型的薄壳 回调式设计。真正的虚拟交换机逻辑全在原生侧Java 层只有一组接口把存储、发包、收帧、事件这四类事交还给你实现。层级负责什么你会碰到的入口Java 层Node 对象 7 个监听接口纯声明Node.javaJNI 层把 Java 调用翻译成 C 函数用 nodeId 当句柄com_zerotierone_sdk_Node.cppNative 层加密、组网、路由真正的交换机本体Node 的 native 方法实现所以集成的心智模型是你不是在驱动SDK而是 SDK 在驱动你。你只做三件事——把数据入口喂给它、接住它推出来的帧、再给它一个节拍。 准备清单5 样东西凑齐再开工为什么先列清单因为 JNI 部分的环境变量只影响构建环节很多人照抄教程却在构建期卡住。要求都写在 java/README.md逐项对照JDK 8 以上编译期用到 ANTAndroid NDKr21提供ndk-buildAndroid SDK 平台API 21 以上环境变量NDK_BUILD_LOC指向 ndk-build 脚本ANDROID_PLATFORM指向 android.jar 所在目录产物libZeroTierOneJNI.so按 ABI 放进app/src/main/jniLibs/如果只消费预编译好的 .so前四项可以跳过直奔最后一条。⚡ 核心流程3 个逻辑块跑通全链路放对 SO加载与入网Node 类内部已经写死了loadLibrary(ZeroTierOneJNI)你不用写任何加载代码.so 放好位置就等于完成接入。这一步只是建节点、注入监听器、宣告入网Node node new Node(System.currentTimeMillis()); ResultCode rc node.init(getL, putL, sender, eventL, frameL, configL, null); node.join(0x8F31C2D4A9B6L);init返回RESULT_OK后join才会生效重复加入同一网络会被忽略并直接返回 OK可以放心幂等调用。接回调把发包口交给你的 UDP 套接字7 个监听器里get/put 是持久化存储的读写两半event 收状态通知frame 和 config 推虚拟网数据与配置变化真正往物理网络发包的只有 PacketSender——它是组网的唯一出口。物理通道我们用一块 UDP 套接字public int onSendPacketRequested(long socket, InetSocketAddress addr, byte[] data, int ttl) { udpSocket.send(new DatagramPacket(data, data.length, addr)); return 0; }返回 0 表示已递交对端收不收得到属于网络层的事SDK 不会替你重传可靠性交给上层协议。喂数据两个入口 一个节拍器ZeroTier One 是被动式的物理线上收到的包要喂给processWirePacket你自己 App 产出的帧要走processVirtualNetworkFrame。两个函数都会把下次后台任务的截止时间写进deadline数组拿它挂定时器最省心byte[] buf new byte[1500]; long[] deadline new long[1]; node.processWirePacket(now, -1, remoteAddr, buf, deadline); node.processVirtualNetworkFrame(now, nwid, srcMac, dstMac, 0x0800, 0, payload, deadline); while (node.isInited()) { Thread.sleep(Math.max(0L, deadline[0] - System.currentTimeMillis())); node.processBackgroundTasks(System.currentTimeMillis(), deadline); }到这里闭环就形成了对端来包 → processWirePacket → 交换机转发 → onVirtualNetworkFrame → 你的业务层。 进阶让 ARP 和 Moon 都听话让 ARP 可规模化普通广播 ARP 在虚拟网里不划算ZeroTier 的解法是对广播 MAC 做订阅、把 ADI 设成各 IPv4 地址主机字节序每个 IP 订一次ARP 就变成精确多播for (long ip : assignedIps) { node.multicastSubscribe(nwid, 0xFFFFFFFFFFFFL, ip); }给组网加一颗 MoonMoon 是缩短跨网段路径的中继枢纽orbit加入、deorbit移除定义会持久化到数据目录里。业务只追求局域网感的话这两项可以先不碰。另外leave、peers、status、networkConfigs这些查询方法都挂在同一个 Node 上用到再查注释即可。️ 踩坑实录5 个高频翻车现场1. 启动即崩现象首启抛UnsatisfiedLinkError。 根因.so 没进 jniLibs或 ABI 与设备对不上。 解法按app/src/main/jniLibs/abi/摆放libZeroTierOneJNI.soNDK 目标架构与设备一致。2. 首次 init 卡住数秒现象第一次init时 UI 冻结。 根因首次运行要生成节点身份弱设备上明显偏慢。 解法丢到后台线程执行界面展示身份生成中状态。3. 数据源致命错误现象返回RESULT_FATAL_ERROR_DATA_STORE_FAILED之后调用全部失效。 根因get/put 监听器背后的持久化目录不可写。 解法init之前先确保监听器实现的目录已创建、权限已就绪。4. Ping 通但 ARP 解析失败现象首包可达之后通信时断时续。 根因漏了按 IP 做 ADI 订阅广播 ARP 无法规模化。 解法拿到网段配置后对每个 IP 各跑一次multicastSubscribe。5. close 之后复用现象close()后新建 Node 行为异常。 根因旧对象已失效而监听器实例还在跨 Node 共享。 解法整套监听器重建、重新init实例绝不复用。join 返回 RESULT_OK 的那一刻你的 App 就接进同一颗星球了。回调细节直接翻 java/src/com/zerotier/sdk 下的接口注释。【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表