ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Kotlin Multiplatform 三方库 connectivity 的 OpenHarmony 鸿蒙化适配指南

Kotlin Multiplatform 三方库 connectivity 的 OpenHarmony 鸿蒙化适配指南 Kotlin Multiplatform 三方库 connectivity 的 OpenHarmony 鸿蒙化适配指南库版本jordond/connectivity 2.2.1 鸿蒙切片2.2.1-ohos.1验证环境HarmonyOS Kotlin 2.2.21-1.0.0Gradle 8.14.1JDK 21DevEco Studio 26.0.0HarmonyOS 7.0.0API 26模拟器127.0.0.1:5555x86_64前两篇 KMP 适配分别验证了两件事。qrcode-kotlin证明 ohos target 能跑纯计算actual 不链系统 so自己光栅、自己编 PNG。multiplatform-settings证明同一套 Gradle / NAPI 骨架能接到设备上的libohpreferences.so。这篇补第三块系统网络状态。我以为把OH_NetConn_HasDefaultNet五个函数名抄进 KotlinArkTS 点一下就能出Connected。然后发生了四件事。第一SDK 的net_connection.h喂给 cinteropavailability 宏把 clang 前端打爆。第二HasDefaultNet的出参是int32_t*第一版按 Preferences 那篇的BooleanVar去读编得过值是错的。第三llvm-nm -D里明明有ConnectivityCallArkTS 直接importKotlin/Native so业务函数根本不在导出表里。第四native 和 ArkTS 都编过了PackageHap却申请 16GB 堆权限漏写GET_NETWORK_INFO五个 C 调用一律返回 201页面会装成「没网」。网络这种库编过不算数。rc 必须露在 JSON 里。Start / Stop 必须让isMonitoring翻转。有 default net 时kind必须是Connected。本文按这条真实路径写。四张是同一台 x86_64 模拟器、同一条以太网。大字一直是Connected变的是 JSONnetId101、monitoring从 true 翻到 false。只看大字会以为 Start / Stop 没生效。一、环境搭建本章不展开直接引用官方入口KMPCMP 鸿蒙社区、HarmonyOS 应用开发导读。本文实际使用项值语言 / 框架Kotlin MultiplatformHarmonyOS Kotlin2.2.21-1.0.0插件仓库https://maven.eazytec-cloud.com/nexus/repository/maven-public/JDKTemurin 21写进gradle.properties的org.gradle.java.homeGradle Wrapper8.14.1DevEco Studio26.0.0HarmonyOS SDK7.0.0API 26真机 ABIohosArm64→arm64-v8a模拟器 ABIohosX64→x86_64HAP 打包 JDKDevEco 自带 JBR不要用 JDK 8系统库libnet_connection.so设备 sysroot不打进 HAP权限ohos.permission.GET_NETWORK_INFOohosArm64()/ohosX64()只存在于这套定制 Kotlin Gradle Plugin。用 Maven Central 上的官方2.2.21写这两行配置期就会Unresolved reference。这是判断工具链有没有接对的第一根探针。二、应用背景跨端业务里「现在有没有网」出现的频率不比键值存储低。启动页要不要打登录、同步按钮要不要转圈、弱网要不要换小图全都先问一句网络状态。Android 走ConnectivityManagerApple 走NWPathMonitor。Jordon de Hoog 的connectivity把差异收口成一个很小的接口valnetConnectivity()net.start()when(valstatusnet.status()){isConnectivity.Status.Connected-println(metered${status.metered})Connectivity.Status.Disconnected-println(offline)}net.stop()commonMain里的业务代码不需要知道底下是ConnectivityManager、NWPathMonitor还是鸿蒙的OH_NetConn_*。鸿蒙缺的只是一个 actual。三条常见路线我都否掉了。在 ArkTS 里直接ohos.net.connection那是使用文不是适配。KMP 业务跑在 Kotlin/Native 线程没有 JS runtime也不能把 Ability 的Context传进commonMain。ohos actual 走 NAPI 回调 ArkTS 网络模块等于每次快照跨一次语言生命周期更乱。KN sharedLib 里也没有 Ability Context。把 JVM 的NetworkInterface原样当鸿蒙实现那是 L1 冒烟不是设备上的默认网。JvmConnectivity留着只给jvmTest对照metered在 JVM 上恒为 false。对位的公开能力是 C APInetwork/netmanager/net_connection.h动态库libnet_connection.so。HasDefaultNet/GetDefaultNet/IsDefaultNetMetered/GetNetCapabilities/GetAllNets从 API 11 开始。目标设备 API 26够用。选题时用git ls-remote扫过 CPF-KMP-CMP 和 oh-tpc已有 Ksoup、kotlin-result、kotlin-multiplatform-diff、Kermit、okio、kotlinx-datetime、SQLiter以及本系列的 qrcode-kotlin、multiplatform-settings没有jordond/connectivity。这是增量题不是重复领激励。方向锁定KMP 三方库适配不是 CMP不是 Flutterconnectivity_plus也不是「拿 ArkTS connection 写业务」的使用文。上游完整 API 绑死kotlinx.coroutines.flow.SharedFlow。本轮 HarmonyOS Kotlin 树没有官方 kotlinx-coroutines ohos 制品。与其交一个「看起来在 collect、回调永远不来」的半残 Flow不如把2.2.1-ohos.1写成无协程切片Status模型保留status()改成同步快照Flow 明确划出范围。三、接口分析按 Demo 实际打到的表面列不把上游statusUpdates、Compose 扩展件算进「已适配」。能力上游 API鸿蒙 actualDemo 按钮验收当前状态suspend status()同步status()内部HasDefaultNetStatuskindConnected或Disconnected计费Connected.meteredIsDefaultNetMeteredMeteredJSONmetered与rc同时给出开始监听start()进程内isMonitoringtrueStartJSONmonitoringtrue停止监听stop()isMonitoringfalseStopJSONmonitoringfalse派生属性isConnected/isDisconnected/isMetered原样Status断开时isMetered必须 false默认网 id上游无诊断GetDefaultNetSnapshotnetId ≥ 0或失败为-1承载 / 能力上游无诊断GetNetCapabilitiesCapabilitiesbearers 含 WIFI / CELLULAR / ETHERNET 等全部网络上游无诊断GetAllNetsAllNetsallNetIds非空或 rc 非 0ArkTS 不直接碰这些 Kotlin API。它只调用一个 NAPI 函数import{ConnectivityCall}fromlibconnectivity_napi.so;constraw:stringConnectivityCall(JSON.stringify({op:snapshot}))asstring;op取snapshot/status/hasDefault/metered/capabilities/allNets/start/stop。返回 JSONok、kind、isConnected、isMetered、monitoring、netId、bearers、capabilities、五个*Rc。UI 进程不懂NetConn_NetHandleKotlin/Native 进程不懂 ArkUI。这是有意设计的。四、六阶段路线图工具链。JDK 21 HarmonyOS Kotlin 2.2.21-1.0.0 Gradle 8.14.1。JDK 8/11 会在配置期直接死。目标矩阵。根项目收成jvm()ohosArm64()ohosX64()。保留 JVM 是为了jvmTest当对照砍掉 iOS / Android / JS是因为这次要在 Windows 上闭环。cinterop。手写netconn_min.h不要把 SDK 的net_connection.h整棵树丢进去。actual。OhosConnectivity实现Connectivity。status()先采NetSnapshot再投影成Connected/Disconnected。C ABI NAPI。example/nativeApp用sharedLib { baseName ohosconnectivity }产出 soCName(ConnectivityCall)导出。CAdapter 不挂业务符号必须再编libconnectivity_napi.so。落盘。HAP 打进两个 ABI 的 so模拟器上八个按钮都有 JSON有 default net 时kindConnectedStart/Stop 翻转 monitoring。六步不能并成「把 ohos target 打开」。第 3 步头文件写错第 4 步的IntVar读出来就是垃圾第 5 步漏了 NAPI第 6 步的按钮全是undefined is not a function。每一步都有独立验收口后文分层验收按这个顺序对。applyDefaultHierarchyTemplate()会在两个 ohos 目标之上生成ohosMain。代码放这里不要放nativeMain以后一旦加 linux会把鸿蒙 Network Kit 强加给不该用的平台。上游原工程还有 compose artifact 和 coroutines 实现。原样打开本轮工具链会在用不到的目标上失败。本仓settings.gradle.kts只留:connectivity和:example:nativeApp。版本号写成2.2.1-ohos.1不要冒充上游正式版。五、三个关键决策5.1 切片而不是假装完整 fork完整 fork 要把statusUpdates: SharedFlowStatus和 Compose 一起搬过来。没有官方 coroutines ohos 制品把kotlinx-coroutines-core写进ohosMain解析阶段就会缺ohosArm64/ohosX64构件。Flow 只能假活。所以公共接口收成publicinterfaceConnectivity{publicvalisMonitoring:Booleanpublicfunstatus():Statuspublicfunstart()publicfunstop()publicsealedinterfaceStatus{publicvalisConnected:BooleanpublicvalisMetered:BooleanpublicvalisDisconnected:BooleanpublicdataclassConnected(publicvalmetered:Boolean):StatuspublicdataobjectDisconnected:Status}}Status密封类保持原样包括三个派生属性。start()/stop()名字也保持原样。缺的是 Flow 收集器和suspend。谁在 commonMain 里collect编译期失败好过运行期挂起。这不是偷工。协程一旦有官方 ohos 构件可以把OhosConnectivity再包一层callbackFlow把OH_NetConn_RegisterDefaultNetConnCallback接进去不必改 common 模型。现在硬接只会让 Demo 永远编不过。5.2 精简头出参用 IntVar第一反应是headers net_connection.h。编不过原因和 Preferences 那篇一样具体。头文件用了__availability__还嵌套net_connection_type.h。cinterop 自带的 clang 前端认不全。我们这轮真正要用的只有五个查询函数回调和 DNS / 代理先不做。所以src/ohosMain/cinterop/下放了两份自己写的文件netconn_min.h按官方字段顺序手抄NetConn_NetHandle、NetConn_NetCapabilities、NetConn_NetHandleListnetconn.def的headers只指向这一份并写linkerOpts -lnet_connection。结构体字段顺序必须和官方头一致。NetConn_NetCapabilities先是上下行带宽再是netCaps[32]netCapsSize再是bearerTypes[32]bearerTypesSize。写反了cinterop 不会报错运行时会把 capability 读成 bearer。编过之后Kotlin 侧还有几条从 dump 出来才知道的事实HasDefaultNet/IsDefaultNetMetered的出参是int32_t *不是bool *。Kotlin 侧是IntVar不是 Preferences 那篇的BooleanVar。写成BooleanVar能编过读出来的值是错的。判定写成value ! 0才算 true。NetConn_NetHandle是结构体值类型字段netId直接读。定长数组用caps.bearerTypes[i]不要当成List。*Size字段必须先coerceIn(0, 32)再遍历。C 侧如果返回脏值Kotlin 会越界模拟器直接 abort。左边六条我都踩过。最隐蔽的是「五个 rc 全是 201」函数名对、so 也链上了页面却写成断网。那不是HasDefaultNet返回 false是权限没声明C API 拒绝回答。右边六条是后来能在模拟器上看到rc0的最低条件。链接时nativeApp的sharedLib必须再加-L$sysroot/usr/lib/abi-linux-ohos -lnet_connection。只在 def 文件写linkerOpts有的发行包不会把它传到最终 so。这些符号运行时由系统libnet_connection.so提供不要把系统库打进 HAP。5.3 业务桥走CName NAPI只信 HasDefaultNetqrcode 和 settings 已经验证过HarmonyOS Kotlin 的 CAdapter 只导出 stdlib 的 Checksum / Zip / GZip。CName(ConnectivityCall)在 ELF 里看得到ArkTSimportKN so 却调不到。缺的是 NAPI 表面不是 C 符号。投影只有一句有默认网就是Connected(metered)否则Disconnected。不要用「bearers 里有 WIFI」当连通条件。不要用GetDefaultNet的netId 0当断网——文档没保证 0 是非法值。GetDefaultNet失败只让netId-1不把 Connected 打成 Disconnected。IsDefaultNetMetered失败则 meteredfalse但 rc 留在 JSON。没有合法 handle 时不要调GetNetCapabilities官方文档写的是 401。库不过问能不能访问公网那是VALIDATED能力位的事。应用层若要「能上网」自己看 capabilities不要改Status语义。start()/stop()在本版只翻isMonitoring。系统里有OH_NetConn_RegisterDefaultNetConnCallback回调在网络服务线程和无协程切片的边界冲突。下一版若补 Flow从这条 API 接而不是在 ArkTS 里setInterval假装监听。六、桥接怎么接调用链从上到下是五层。中间少一层就会在dlopen或undefined is not a function上爆。ArkTS → libconnectivity_napi.so (NAPI) → ConnectivityCall() → libohosconnectivity.so (KN) → libnet_connection.soHAP 里真正要带的只有三份libconnectivity_napi.so、libohosconnectivity.so、libc_shared.so。libnet_connection.so在设备 sysroot打进包反而会和系统库抢加载。C 包装层不解析 JSON也不调OH_NetConn_*。解析、IntVar判定、bearer 名字都停在 Kotlin。Demo 按官方 native 模块来entry/src/main/cpp/napi_init.cpp编成libconnectivity_napi.so内部链接libohosconnectivity.so调完用DisposeString把 KN 分配的 C 字符串释放掉。C 里不解析 JSON也不调OH_NetConn_*。解析和映射都在 Kotlin。example/nativeApp的Bridge.kt吃一小段 JSON在 Kotlin 里走完整OhosConnectivityCName(ConnectivityCall)funconnectivityCall(request:String):Stringdispatch(request)privatevalconnectivityOhosConnectivity()// snapshot 一次打五个 C 调用截图不依赖输入法valsnapconnectivity.snapshot()有四个地方我写错过。baseName是String不是PropertyString。写成baseName.set(ohosconnectivity)会在 configuration 阶段报Unresolved reference set。正确是baseName ohosconnectivity。CName参数用String。KN 生成const char*ABI。返回的 C 字符串必须DisposeStringNAPI 包装层已经做了ArkTS 不用管。entry/build-profile.json5的abiFilters必须同时有arm64-v8a和x86_64。本机 DevEco 模拟器是 x86_64。只编 arm64安装会报9568347看起来像签名问题其实是 ABI 缺失。ArkTS 严格模式禁止Any。Index.ets用CallResult接口收字段JSON 用JSON.parse(raw) as CallResult。不要写成any。linkDebugSharedOhosArm64/OhosX64已经finalizedBy拷贝任务会把libohosconnectivity.so和 Kotlin/Native 依赖的libc_shared.so一起放进entry/libs/abi/。漏掉 libc运行时是Error loading shared library libc_shared.so。CMake 强制-Wl,-rpath,$ORIGIN、BUILD_WITH_INSTALL_RPATH TRUE、IMPORTED_NO_SONAME TRUE。IMPORTED 库会把本机绝对路径写进 so真机上那条路径毫无意义。nm_modname必须是connectivity_napi和oh-package.json5对上。名字写错ArkTS 会编译过、运行时报模块找不到。JSON 解析是手写的极简扫描只认字符串字段。不要在 KN 侧再拉 kotlinx.serialization——ohos 目标的依赖图会被重新打乱。对外截图只点按钮不碰输入法。七、踩坑表现象根因处理Unresolved reference: ohosArm64用了官方 Kotlin 2.2.21换成 HarmonyOS Kotlin 2.2.21-1.0.0仓库放到pluginManagement第一位cinterop 喂 SDK 头直接死availability 属性 / 额外头手写netconn_min.hBooleanVar读 HasDefaultNet出参是int32_t *用IntVarvalue ! 0模拟器 abort数组没看 SizecoerceIn(0, 32)importKN so 调不到ConnectivityCallCAdapter 不导出业务符号ArkTS 改 importlibconnectivity_napi.so9568347安装失败HAP 缺 x86_64abiFilters加上x86_64并链接 ohosX64Error loading shared library libc_shared.so只拷了 KN socopy 任务同时带上 Konan 的libc_shared.soPackageHapUnable to allocate 522624KB bitmaps ... 16723968KB heappacking tool 起 JVM 时堆被要到 16GBDevEco JBR JAVA_TOOL_OPTIONS-Xmx2g五个 rc 全是 201看起来像没网没申请GET_NETWORK_INFOmodule.json5里requestPermissions看起来像断网把netId0或带宽 0 当成离线只信HasDefaultNetStart 之后大字不变本版无 OS 回调看 JSONmonitoring字段再点 Snapshotsnapshot_display失败本模拟器要求后缀.jpeg不要用.png以太网仍报meteredtrue系统给的计费标记原样上送不要按 WIFI 去猜权限是 system_grant不用运行时弹窗但必须声明。漏了它五个 rc 全是 201看起来像没网。Demo 把 rc 打在页面上就是为了这一幕。PackageHap 这一条值得单独说。native 和 ArkTS 都已经编过了失败发生在最后把 so 塞进 HAP 的 Java 工具。日志原文是Unable to allocate 522624KB bitmaps for parallel garbage collection for the requested 16723968KB heap。不是工程写错是 JVM 参数。换 JBR 并限制-Xmx2g之后PackageHap几百毫秒就过。八、Demo 验收每个接口一张实拍包名org.terminator.ohos.connectivityAbilityEntryAbility。本机模拟器hdc install后hdc shell aa start -a EntryAbility -b org.terminator.ohos.connectivity下面每张图都是从模拟器抠出来的不是合成。状态栏时间 09:22 附近。字幕写的是KMP connectivity OH_NetConn C API。不要只贴一张启动图交差。网络库要看连通态、计费、能力位、Start/Stop 翻转。本次模拟器走以太网大字ConnectedbearersETHERNET五个 rc 全是 0。8.1 Snapshot一次打五个 C 调用启动即snapshot。状态卡ConnectednetId101bearersETHERNETcapabilitiesINTERNET, NOT_VPN, VALIDATED五个返回码全是 0。这一步过了说明 NAPI → KN →OH_NetConn_HasDefaultNet整条链是通的。如果是失败:开头先查 so 有没有进 HAP再查权限。JSON 里kindConnected、hasDefaultRc0。这是status()投影和诊断快照一次打通的证据。8.2 StatuscommonMain 表面点Status。opstatus的响应更短只留kind/isConnected/isMetered/isDisconnected/monitoring/netId。这是给 commonMain 看的表面不带 bearer 数组。断开时isMetered必须是 false。这是密封类派生属性的契约不是 UI 自己算的。8.3 HasDefault权限探针点HasDefault。hasDefaultNettruerc0。缺权限时这里会变成rc201页面会装成没网。把 rc 画出来就是为了把「没权限」和「没网」分开。8.4 Metered原样上送系统标记点Metered。meteredtruerc0。模拟器以太网被标成计费网以 C API 为准不要在 Kotlin 里按 WIFI 去猜。真机 Wi-Fi 会不会仍是 true要等签名后再测现在不能编造。8.5 Capabilitiesbearer 与能力位点Capabilities。bearers[ETHERNET]capabilities[INTERNET,NOT_VPN,VALIDATED]。VALIDATED表示系统认为这条默认网能上网但Status本身不读这个位。带宽两个字段在本机模拟器上是 0C 调用返回码是 0说明函数成功了只是这条虚拟网卡没填速率。不要写成「API 没接上」。8.6 AllNets诊断字段点AllNets。allNetIds[101]。诊断字段不参与status()投影。多网卡真机上这里会超过一个 id本模拟器只有默认以太网。8.7 Startmonitoring 翻成 true点Start。last op: startJSONmonitoring:true。大字仍是 Connected这是本版预期start 还不注册 OS 回调。只看大字会误判没生效。8.8 Stopmonitoring 翻回 false点Stop。last op: stopJSONmonitoring:false。Start / Stop 必须成对截图。飞行模式能拍到 Disconnected 更好。部分模拟器关 WIFI 仍留虚拟以太网HasDefaultNet仍可能是 1。以 C API 为准。九、分层验收不要把「库编过」和「页面上 kindConnected」混成一次验收。四层口子分开过。L1 只证明密封类派生属性没写反。L2 用nm看ConnectivityCall在不在 ELF 里在也不代表 ArkTS 能调。L3 打开 HAP 看三个 so 是不是两个 ABI 都有。L4 才看五个*Rc是不是 0。上一层绿、下一层红不要回头改commonMain。层命令我这边的结果L1gradlew :connectivity:jvmTestconnectedStatusFlags、disconnectedStatusFlags、providerBackedStartStop、jvmFactoryReturnsSnapshot绿。公共 API 语义在 JVM 上对照过L2gradlew :example:nativeApp:linkDebugSharedOhosArm64 :example:nativeApp:linkDebugSharedOhosX64两个 ABI 的 so 都导出ConnectivityCall并拷到entry/libs/abi/L3 编译hvigorw assembleHap -p moduleentrydefault -p productdefault --no-daemonHAP 内arm64-v8a/x86_64各含libconnectivity_napi.so、libohosconnectivity.so、libc_shared.soL4 运行hdc install 真点击Snapshot / Status / HasDefault / Metered / Capabilities / AllNets / Start / Stop 全部有实拍打包必须用 DevEco JBR。本机默认JAVA_HOME若指向 JDK 8或 packing tool 被要到 16GB 堆PackageHap会直接起不来。native 其实已经编过了只是最后把 so 塞进 HAP 的那一步没起来。命令行里固定$env:JAVA_HOME C:\Program Files\Huawei\DevEco Studio\jbr$env:JAVA_TOOL_OPTIONS -Xmx2g命令行打出来的是 unsigned HAP。这个模拟器接受了hdc install。真机和正式签名仍走 DevEco 的signingConfig: default不要在build-profile.json5里把这段改空。Windows 上链出来的 ohos so 不能在本机dlopen。对照测试走jvmTest设备行为走 HAP。不要在第 L4 失败时回头改commonMain模型——先hilog搜ConnectivityNapi看 JSONerror和五个*Rc。十、已知限制不是 CMP。没有 Compose 控件没有联网动画。KMP 和 CMP 是两条配额线这个库走 KMP。没有协程。statusUpdates: SharedFlowStatus和suspend fun status()不在 2.2.1-ohos.1 里。等官方 coroutines ohos 构件。没有默认网回调。OH_NetConn_RegisterDefaultNetConnCallback没绑。Start / Stop 只切换本地标志。没有 HTTP 探测。上游connectivity-http用实际请求判断「真的能上网」。本仓只读系统 default net。门户网络PORTALcapability能看见但不会自动发探测包。JVM 的metered恒为 false。Java 没有可移植的计费网 API。JvmConnectivity只给宿主测试对照。NetSnapshot只在 ohos 源集。netId/bearers/capabilities不是跨平台 API不要在 commonMain 依赖它们。带宽在本模拟器上为 0。返回码是成功不要当成没接 API。模拟器以太网报 meteredtrue。原样上送不在 actual 里改写。CAdapter 限制仍在。即使 ELF 能看到CName(ConnectivityCall)ArkTS 也必须走 NAPI。不要在下一篇里再踩一次还当新发现。模拟器 ABI。本地 DevEco 模拟器是 x86_64。只交 arm64 HAP安装失败码经常被误判成证书问题。真机签名未跑。模拟器 unsigned 可装。对外演示请在 DevEco 配signingConfig: default再用 arm64 真机走一遍 Wi-Fi / 蜂窝 / 飞行模式。仓库位置。适配代码在 oh-tpc/jordond社区组织仍是 CPF-KMP-CMP。不往 Flutter 组织塞 KMP 库。有人会问鸿蒙自己就有 netManager为什么还要 KMP 这一层。答案不是性能是边界。ArkTS NetConnection 的上下文是 UIAbilityAPI 是 Promise。KMP 业务拿到的是同步 C ABI没有 JS runtime。把 KN 的status()回调到 ArkTS 再读等于每次启动都要跨一次 NAPI。本适配站在OH_NetConn这一层。Demo 之所以还出现 ArkTS只是因为要有一个能点的界面和征文要求的全接口截图。真正给业务用的入口是OhosConnectivity不是Index.ets。十一、如何提 Issue / PR上游功能问题优先去 jordond/connectivity。鸿蒙 actual、cinterop 头、NAPI 包装、Demo 安装问题开在适配仓库。不要把ohosArm64编译日志丢给上游——那不是他们的 target。上游 GitHub 的 CI 跑不了ohosArm64()不要把定制插件的 Gradle 硬推给上游当普通 PR。请固定带这六项否则很难判断是权限问题、ABI 问题还是真的没网ABI真机ohosArm64还是模拟器ohosX64操作snapshot/status/hasDefault/metered/capabilities/allNets/start/stopJSON 原文尤其是五个*Rc字段module.json5是否声明GET_NETWORK_INFOhilog搜ConnectivityNapi/ConnectivityDemo界面实拍不要只贴「没网」两个字PR 建议拆开src/ohosMain的实现 / cinterop 是库本体example/nativeApp的CName是 C ABIexample/harmonyApp的 CMake 是 NAPI。不要把三种改动揉进同一个 commit。示例工程保持signingConfig: default。克隆适配仓请走 AtomGit 组织页导入后再git clone不要写第三方镜像站地址。十二、小结这次适配没有发明新的网络协议。commonMain里的Status模型原样工作。鸿蒙侧真正要补的是三块一份 cinterop 肯吃的精简头以及 dump 出来才知道的IntVar/ 定长数组访问方式一个守住 snapshot 语义的OhosConnectivity只信HasDefaultNet把 bearer 和 capability 原样上送一层 CAdapter 不肯给的 NAPI 表面外加双 ABI so让 x86_64 模拟器也能装前两块是常规 KMP。第三块是 HarmonyOS Kotlin 目前的现实前两篇已经踩过这篇用系统网络库又确认了一次。谁要是把「so 里有符号」当成「ArkTS 能调用」或者把「编过」当成「真的读到了网卡」会在 201 返回码和9568347上再浪费整下午。和qrcode-kotlin、multiplatform-settings是同一条工具链上的三个样本。一个纯计算、不链系统 so一个必须dlopen设备上的libohpreferences.so一个必须dlopen设备上的libnet_connection.so。三篇一起看才能判断 ohos target 是不是真的接上了而不是复制了一份 so。模拟器已经把 Snapshot / Status / HasDefault / Metered / Capabilities / AllNets / Start / Stop 跑通。仓库在 oh-tpc/jordond。下一步用 DevEco 默认签名在真机上再走一遍 Wi-Fi 和飞行模式。如果只记住一件事在 HarmonyOS Kotlin 这条链上Kotlin/Native so 负责对系统 C API 读网卡CMake NAPI so 负责被 ArkTS 看见GET_NETWORK_INFO负责让五个返回码是 0 而不是 201。三者缺一截图上要么是断网要么是装都装不上。KMPCMP 社区地址https://atomgit.com/CPF-KMP-CMPGitHub 上游https://github.com/jordond/connectivity鸿蒙适配版https://atomgit.com/oh-tpc/jordond示例工程example/harmonyApp欢迎加入 KMPCMP 鸿蒙社区https://atomgit.com/CPF-KMP-CMP
返回列表