

前两篇文章分别探讨了 Flutter 与开源鸿蒙(OpenHarmony)融合的战略价值与深度集成路径。然而,对于广大开发者而言,真正决定技术采纳意愿的,往往是 “能否快速上手” 和 “如何调用系统能力” 这两个现实问题。
本文将聚焦于 Flutter 在 OpenHarmony 上的插件开发实践,通过一个完整的示例——获取设备电池信息,手把手演示如何编写 Dart 层接口、实现 C++/NAPI 原生桥接、调用 OpenHarmony 系统 API,并最终在 Flutter 应用中使用。所有代码均基于 OpenHarmony 4.1 SDK 与 Flutter 3.22+ 环境,具备可复现性。
在 OpenHarmony 上,Flutter 插件的调用链如下:
Dart (Flutter UI)
↓ (MethodChannel)
C++ (Plugin Entrypoint)
↓ (NAPI)
ArkTS/JS (OpenHarmony System API via @ohos.batteryInfo)
↓
Kernel / HAL由于 OpenHarmony 不支持 Android 的 Java/Kotlin 或 iOS 的 Objective-C,传统 Flutter 插件无法直接复用。必须通过 NAPI(Native API) 接口,由 C++ 层桥接到 OpenHarmony 的 JS/ArkTS 系统能力模块。
注:目前主流方案是通过 JS Bridge + NAPI 间接调用,未来若 OpenHarmony 提供纯 C/C++ 系统 SDK,可进一步简化。
ohos_battery 插件我们将创建一个名为 ohos_battery 的插件,用于获取当前设备的电池电量百分比。
flutter create --org com.example --template=plugin --platforms=ohos ohos_battery注意:截至 2025 年,官方 Flutter 尚未内置
--platforms=ohos,需使用社区 fork 版本(如flutter-ohos)或手动添加 ohos 目录结构。
项目结构如下:
ohos_battery/
├── lib/
│ └── ohos_battery.dart # Dart 接口
├── ohos/
│ ├── src/main/cpp/ # C++ 桥接代码
│ │ ├── ohos_battery.cpp
│ │ └── CMakeLists.txt
│ └── src/main/js/ # JS 调用系统 API(临时方案)
│ └── battery_bridge.js
└── pubspec.yamllib/ohos_battery.dart)import 'package:flutter/services.dart';
class OhosBattery {
static const MethodChannel _channel =
MethodChannel('com.example/ohos_battery');
/// 获取电池电量(0~100)
static Future<int> getBatteryLevel() async {
final int? level = await _channel.invokeMethod('getBatteryLevel');
return level ?? -1;
}
}这里通过 MethodChannel 向原生层发送 'getBatteryLevel' 方法调用。
ohos/src/main/cpp/ohos_battery.cpp)#include "napi/native_api.h"
#include "napi/native_node_api.h"
#include <string>
// 模拟调用 JS Bridge(实际项目中可通过 JS Engine 执行 battery_bridge.js)
// 此处为简化,直接返回模拟值;真实场景需集成 JS 引擎或等待官方 C API
static napi_value GetBatteryLevel(napi_env env, napi_callback_info info) {
napi_value result;
// 假设通过某种方式从 OpenHarmony 获取到电量为 78%
int32_t batteryLevel = 78;
napi_create_int32(env, batteryLevel, &result);
return result;
}
static napi_value Init(napi_env env, napi_value exports) {
napi_property_descriptor desc = {
"getBatteryLevel", nullptr, GetBatteryLevel, nullptr, nullptr, nullptr, napi_default, nullptr
};
napi_define_properties(env, exports, 1, &desc);
return exports;
}
// 注册插件入口
EXTERN_C_START
void InitOhosBattery(napi_env env, napi_value exports) {
Init(env, exports);
}
EXTERN_C_END⚠️ 当前限制:OpenHarmony 的
@ohos.batteryInfo仅提供 ArkTS/JS 接口,无 C/C++ SDK。因此,真实项目需通过嵌入 QuickJS 或 Hermes 引擎执行 JS 代码来调用系统 API。此处为教学简化,直接返回模拟值。
ohos/src/main/js/battery_bridge.js)// battery_bridge.js
import batteryInfo from '@ohos.batteryInfo';
export function getBatteryLevelSync() {
try {
const info = batteryInfo.getBatteryInfoSync();
return info.level; // 返回 0~100 的整数
} catch (err) {
console.error('Failed to get battery info:', err);
return -1;
}
}在 C++ 层中,可通过以下方式调用此 JS 函数(伪代码):
// 使用 QuickJS 示例
JSContext* ctx = JS_NewContext();
JSValue val = JS_Eval(ctx, "getBatteryLevelSync()", ...);
int level = JS_ToInt32(ctx, val);完整实现需集成 JS 引擎,工程较复杂。这也是当前 Flutter on OpenHarmony 的主要技术瓶颈之一。
ohos/src/main/cpp/CMakeLists.txt)cmake_minimum_required(VERSION 3.18)
project(ohos_battery)
add_library(ohos_battery SHARED
ohos_battery.cpp
)
target_include_directories(ohos_battery PRIVATE
${OHOS_SDK}/native/sysroot/usr/include
)
target_link_libraries(ohos_battery
libace_napi.z.so
)并在 build-profile.json5 中声明原生库:
{
"app": {
"bundleName": "com.example.ohos_battery",
"nativeLibs": ["libs/ohos_battery.so"]
}
}// main.dart
import 'package:flutter/material.dart';
import 'package:ohos_battery/ohos_battery.dart';
void main() => runApp(const MyApp());
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _batteryLevel = 'Unknown';
@override
void initState() {
super.initState();
_getBatteryLevel();
}
Future<void> _getBatteryLevel() async {
int level = await OhosBattery.getBatteryLevel();
setState(() {
_batteryLevel = 'Battery: $level%';
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('OpenHarmony Battery Demo')),
body: Center(child: Text(_batteryLevel)),
),
);
}
}问题 | 说明 | 建议 |
|---|---|---|
缺乏 C/C++ 系统 API | OpenHarmony 系统能力多为 ArkTS/JS 提供 | 推动官方开放 Native SDK;短期采用 JS 引擎桥接 |
插件打包复杂 | 需同时处理 Dart、C++、JS、HAP | 开发自动化脚本(如 ohpm-flutter 工具) |
调试困难 | C++ 层崩溃难定位 | 启用 NAPI 日志 + DevEco Native Debugger |
性能开销 | JS 引擎 + Dart VM 双运行时 | 探索 AOT 编译 Dart + 直接系统调用 |
随着 OpenHarmony 生态成熟,我们期待:
ohos 平台标签,便于插件分发。虽然当前在 OpenHarmony 上开发 Flutter 插件仍面临诸多工程挑战,但通过合理的架构设计与社区协作,开发者已能构建出具备实用价值的跨平台应用。本文提供的电池信息插件虽为简化示例,却完整展示了从 Dart 到系统能力的调用链条。
代码即桥梁,实践出真知。希望本文能为投身 OpenHarmony 与 Flutter 融合开发的先行者提供切实可行的参考。未来,随着底层支持的完善,Flutter 或将成为 OpenHarmony 生态中最活跃的应用开发框架之一。