一次 Android NDK 链接失败:让 CMake 正确传递 object library 对象文件

一、问题背景 APlay 的 C++ SDK 通过一层 Android.mk 风格的 CMakeHelper 来组织模块。业务侧不用直接写 add_library()、target_link_libraries(),而是用 LOCAL_MODULE、LOCAL_INTERFACE_LIBRARIES、LOCAL_OBJECT_LIBRARIES 这类变量描述 target 关系。 Android SDK 的 JNI 入口目标是 APla…

APlay 为什么不把 mDNS 拆成独立进程

背景 在 UxPlay 的 PR #523 中,我们用内置的 mDNS responder 替换了 Avahi 依赖。PR 的 reviewer 提出了一个架构建议:是否应该把 mDNS 功能拆成独立进程,让用户自己选择用什么 mDNS 实现(Avahi、mDNSResponder 等)? 这个建议本身很合理——桌面场景下确实可以这样分工。但当目标平台变成 Android、HarmonyOS、RTOS 和裸embedded Linux…

AirPlay mDNS Harness:模拟 AirPlay 设备的技术实现

在 APlay 项目中,mDNS 服务发现是 AirPlay/RAOP 设备被发现的基础。本文介绍的 AirPlay mDNS harness 借助一个轻量的验证框架,无需真实硬件,在单机上完成了 mDNS 协议实现的验证。本文从流程、代码到协议细节,完整解析这个"模拟设备"是如何工作的。 背景:为什么需要模拟设备 APlay 是一个支持 AirPlay/RAOP 协议的服务端实现。AirPlay 设备被发现依赖 mDNS(Multic…

用 Android.mk 的写法组织 CMake:让跨平台 C++ 构建更像填表

一、为什么要再封一层 CMake CMake 很强,但刚开始接触时也很容易写乱。 比如我们想做一件很普通的事:写一个 hello object library,再写一个 basic_hello_world 可执行程序去使用它。原生 CMake 可能会这样写: add_library(hello OBJECT hello/src/hello.cpp) target_include_directories(hello PUBLIC hell…

Harness Engineering 入门指南:让 AI 稳定干活

大模型已经很会写代码了,但真正用起来以后,很多人会遇到一个尴尬问题:它能很快生成一大堆东西,却不一定稳定、可维护、符合项目约定。 第一次看起来很惊艳,第二次开始风格漂移,第三次改坏旧逻辑,第四次你发现自己在给 AI 生成的代码收拾现场。于是效率提升没有想象中那么大,问题从“我写代码慢”变成了“我审 AI 代码很累”。 Harness Engineering 要解决的就是这个问题。 它不是一个新框架,也不是某个插件,而是一种使用 AI A…