0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用cpp编写用于小型系统的app

OpenHarmony技术社区 来源:OpenHarmony技术社区 2023-04-25 09:47 次阅读

本文将介绍如何使用 cpp 编写用于小型系统的 app。

Ability相关介绍

Ability 是应用所具备能力的抽象,也是应用程序的重要组成部分。Ability 是系统调度应用的最小单元,是能够完成一个独立功能的组件。

一个应用可以包含一个或多个 Ability。其中 Ability 又分为 Page 类型的和 Service 类型的,前者是为用户提供人机交互能力的,后者是提供后台任务机制的。

简单来讲就是 Page 带界面,Service 不带界面。这里将重点介绍 Page 类型的 Ability。

dfb15d5a-e307-11ed-ab56-dac502259ad0.png

使用到的子系统有 Ability 子系统、包管理子系统和图形 UI 子系统。

Ability 子系统是管理 OpenHarmony 应用运行状态的开发框架;包管理子系统是 OpenHarmony 为开发者提供的安装包管理框架;图形 UI 子系统提供基础 UI 组件和容器类组件。

dfd4821c-e307-11ed-ab56-dac502259ad0.png

简单实现

①ability 和 abilityslice

abilityslice 是单个页面及其控制逻辑的总和,是 Page 类型 Ability 特有的组件。

一个 Page 类型的 Ability 可以包含多个 AbilitySlice,此时,这些页面提供的业务能力应当是高度相关的。dfe6c1c0-e307-11ed-ab56-dac502259ad0.png

②生命周期

整体流程下来大致有 OnStart()、OnAvtive()、OnInactive()、OnBackground() 和 OnStop() 五阶段。

abilityslice 生命周期与 ability 相似,但是仍要区分。dff57e68-e307-11ed-ab56-dac502259ad0.png

③hello world

./helloworld/
├──config.json//配置文件
├──resource//资源
└──src//主要文件
├──include
│├──main_ability.h
│└──main_ability_slice.h
└──main
├──main_ability.cpp
└──main_ability_slice.cpp
首先定义并注册 ability:
//main_ability.h
#ifndefHELLO_MAIN_ABILITY_H
#defineHELLO_MAIN_ABILITY_H

#include"ability_loader.h"

namespaceOHOS{
classMainAbility:publicAbility{
protected:
voidOnStart(constWant&want)override;//Want结构体,ability的相关信息
/*
*由于在这里我们只要简单的展示helloworld标签,其它函数不需要重载。
*/
//voidOnInactive()override;
//voidOnActive(constWant&want)override;
//voidOnBackground()override;
//voidOnStop()override;
};
}

#endif
//main_ability.cpp
#include"main_ability.h"

namespaceOHOS{
REGISTER_AA(MainAbility)//使用REGISTER_AA注册ability

voidMainAbility::OnStart(constWant&want)
{
printf("ThisisMainAbilityOnStartstatus!
");
SetMainRoute("MainAbilitySlice");//设置主页面为MainAbilitySlice,这要与后续的slice名字匹配

Ability::OnStart(want);
}
}

e0065a3a-e307-11ed-ab56-dac502259ad0.png

最后编写 slice 界面:
//main_ability_slice.h
#ifndefHELLO_ABILITY_SLICE_H
#defineHELLO_ABILITY_SLICE_H

#include"ability_loader.h"
#include"ability_manager.h"
#include"bundle_manager.h"
#include"components/ui_label.h"

namespaceOHOS{
classMainAbilitySlice:publicAbilitySlice{//创建AbilitySlice类与上面同名
public:
MainAbilitySlice()=default;
virtual~MainAbilitySlice();

protected:
voidOnStart(constWant&want)override;
/*
*同理
*/
//voidOnInactive()override;
//voidOnActive(constWant&want)override;
//voidOnBackground()override;
//voidOnStop()override;
};
}
#endif
//main_ability_slice.cpp
#include"main_ability_slice.h"
constintscreen_width=720;
constintscreen_height=1280;

namespaceOHOS{
REGISTER_AS(MainAbilitySlice)

MainAbilitySlice::~MainAbilitySlice()
{
printf("Thisis~MainAbilitySlice!rn");
}

voidMainAbilitySlice::OnStart(constWant&want)
{
AbilitySlice::OnStart(want);
RootView*rootView_=RootView::GetWindowRootView();//创建底层界面
rootView_->SetPosition(0,0,screen_width,screen_height);
rootView_->SetStyle(STYLE_BACKGROUND_COLOR,Color::Black()));
rootView_->SetFocusable(true);
rootView_->SetInterceptFocus(false);

UILabel*label=newUILabel();//创建label写入HelloWorld
label->SetPosition(0,0,720,64);
label->SetText("HelloWorld!");
label->SetFont("SourceHanSansSC-Regular.otf",64);
label->SetStyle(STYLE_TEXT_COLOR,Color::White()));

rootView_->Add(label);//将label放入rootView

SetUIContent(rootView_);//设置显示RootViewUI
}
}
#endif

e02388f8-e307-11ed-ab56-dac502259ad0.png

④config.json 的编写

//config.json
{
"app":{
"bundleName":"com.sample.hello",
"vendor":"sample",
"version":{
"code":1,
"name":"1.0"
},
"apiVersion":{
"compatible":3,
"target":4
}
},
"deviceConfig":{
"default":{
}
},
"module":{
"package":"com.sample.hello",
"name":".MyHarmonyAbilityPackage",
"deviceType":[
"phone",
"tv",
"tablet",
"pc",
"car",
"smartWatch",
"sportsWatch",
"smartVision"
],
"distro":{
"deliveryWithInstall":true,
"moduleName":"hello",
"moduleType":"entry"
},
"abilities":[//ability配置声明
{
"name":"MainAbility",
"label":"helloworldapp",
"launchType":"standard",
"type":"page",
"visible":true
}
]
}
}

hap编译

①通过 BUILD.gn 与系统一并编译

使用到编译链中的 hap_pack,添加配置:

import(“/ildte/config/hap_pack.gni”)
import("//build/lite/config/hap_pack.gni")

shared_library("hello"){
sources=[
"src/main/main_ability.cpp",
"src/main/main_ability_slice.cpp"
]#将主要文件编译出库

deps=[
"${aafwk_lite_path}/frameworks/ability_lite:aafwk_abilitykit_lite",
"${appexecfwk_lite_path}/frameworks/bundle_lite:bundle",
"//foundation/graphic/ui:lite_ui",
"//foundation/graphic/utils:lite_graphic_utils",
"//foundation/systemabilitymgr/samgr_lite/samgr:samgr",
]

include_dirs=[
"src/include",
"${aafwk_lite_path}/interfaces/kits/ability_lite",
"${aafwk_lite_path}/interfaces/kits/want_lite",
"${appexecfwk_lite_path}/interfaces/kits/bundle_lite",
]

ldflags=["-shared"]
ldflags+=["-lstdc++"]
ldflags+=["-L$ohos_root_path/sysroot/usr/lib"]
ldflags+=["-Wl,-rpath-link=$ohos_root_path/sysroot/usr/lib"]
ldflags+=[
"-lui",
"-lability",
]#添加依赖

defines=[
"ENABLE_WINDOW=1",
"ABILITY_WINDOW_SUPPORT",
"OHOS_APPEXECFWK_BMS_BUNDLEMANAGER",
]#配置定义
}

hap_pack("hello_hap"){#打包成hap
deps=[":hello"]
mode="hap"
json_path="config.json"
ability_so_path="$root_out_dir/libhello.so"#编译后的库文件
force="true"
cert_profile="com.huawei.launcher_AppProvision_release.p7b"#由于不清楚获取证书方法先用源码案例自带的证书代替
resources_path="resources"
hap_name="hello"
}

②通过 app_packing_tool 单独编译

该打包工具在源码目录 developtools/packing_tool/jar 下。

主要参数如下:

e039c758-e307-11ed-ab56-dac502259ad0.png

具体操作:还是得先将动态库编译出来,然后将动态库 libhello.so 和 config.json 放到一个文件夹里。
./out/
├──config.json
└──libhello.so
最后使用 java -jar app_packing_tool.jar 进行打包,如下:
java-jarapp_packing_tool.jar|
--modehap|
--json-path./config.json|
--ability-out-path./libhello.so|
--out-path./hello.hap

hap安装

①安装命令 bm

由于小型系统不支持使用 HDC 工具,我们需要使用到 bm 命令进行安装程序。
bmset-sdisable//取消签名安装。
bminstall-psystem/internal/hello.hap//使用BUILD.gn一起编译的hap默认会在这个路径,如果使用工具打包的,视情况填写路径。

②相关参数

#bm
Usage:installhap-path[options]
Description:
--help|-hhelpmenu
--happath|-plocationofthehaptoinstall
Usage:uninstallbundle-name[options]
Description:
--help|-hhelpmenu
--bundlename|-nnameofthebundletouninstall
Usage:dump[options]
OptionDescription:
--help|-hhelpmenu
--list|-lapplist
--bundlename|-ndumpinstalledhap'sinfo
--metadatakey|-mdumpbundleNamesmatchmetaDatakey
Usage:set[options]
OptionDescription:
--externalmode|-estatusenableexternalmode
--debugmode|-dstatusenabledebugmode
--signmode|-sstatusenablesignmode

小型系统的 bm 指令是标准系统的阉割版。

安装成功后就可以打开该 app,部分小型系统的设备屏幕没有触摸功能和鼠标驱动,我们可以使用 aa 命令来启动 app。
aastart-pcom.sample.hello-nMainAbility//包名和ability名都在config.json中定义
#aa
Usage:
aastart-pbundlename-nability_name
aastopability-pbundlename-nability_name
aaterminate-pbundlename
aadump-pbundlename-nability_name-eextra_option
aadump-a

Options:
-h(--help)Showthehelpinformation.[eg:aa-h]
-p(--bundlename)Appointthebundlenamename.[eg:-pcom.huawei]
-n(--abilityname)Appointtheabilityname.[eg:-nMyAbility]
-a(--all)[Unnecessary]dumpallabilityinfo.[eg:-a]
-e(--extra)[Unnecessary]extrainfowhendump.[eg:-e]

Commands:
aastartStartthetargetability.
aastopabilityStopthetargetserviceability.
aaterminateTerminatethetargetapp.
aadumpDumpability

总结

使用 cpp 编写用户应用程序,我们可以更方便有效的调用南向接口,这将会在开发和调试的过程中给我们带来极大的便利。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • APP
    APP
    +关注

    关注

    33

    文章

    1568

    浏览量

    72365
  • 应用程序
    +关注

    关注

    37

    文章

    3240

    浏览量

    57596
  • OpenHarmony
    +关注

    关注

    25

    文章

    3658

    浏览量

    16131

原文标题:OpenHarmony上编写app

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C++程序的结构特性

    全面兼容C,C的许多代码不经修改就可以为Cpp所用,用C编写的库函数和实用软件可以用于Cpp
    发表于 09-19 11:19 683次阅读

    请问keil编写的BootLoader可以跳转到GCC编写APP里吗?

    keil编写的BootLoader 可以跳转到 GCC编写APP里吗?
    发表于 04-18 07:00

    idf4.4在cmakelists中设置了main.cpp依然找不到app_main ?为什么?

    ./Src/main.cpp ./Src/ringbufferUart.cpp ./Src/app_tasks.cpp ./Src/md5.cpp ./Src/util.
    发表于 06-17 07:42

    CPP和C共存的诀窍是什么?

    CPP和C共存的诀窍是什么?我有一个使用数学函数的单独的CPP库。主C程序使用CPP LIB。对于主项目的标准编译失败了许多对CPP数学函数的未定义的引用,例如,如果我添加了LIXXC
    发表于 01-22 14:49

    Stm32的bootloader和App编写注意事项有哪些?

    Stm32的bootloader和App编写注意事项有哪些?如何使用STM32F4的BootLoader和APP程序?
    发表于 10-29 07:35

    如何利用App inventor编写安卓app控制ESP8266?

    如何利用App inventor编写安卓app控制ESP8266?
    发表于 02-11 07:04

    OpenHarmony轻量与小型系统入门概述

    简介 OpenHarmony轻量和小型系统用于内存较小的IOT设备(参考内存≥128KiB)。通过本文,开发者可以快速熟悉OpenHarmony轻量和小型
    发表于 05-06 15:48

    idf4.4在cmakelists.txt中设置了main.cpp依然找不到app_main是为什么?

    /main.cpp./Src/ringbufferUart.cpp./Src/app_tasks.cpp./Src/md5.cpp./Src/util.
    发表于 02-14 06:36

    嵌入式小型TCPIP协议栈

    一个专为嵌入式系统编写小型TCP/IP协议栈 TCP/IPLean
    发表于 10-08 17:23 50次下载

    一个专为嵌入式系统编写小型TCP IP协议栈

    一个专为嵌入式系统编写小型TCP IP协议栈
    发表于 02-08 01:38 17次下载

    LTC6946 Lduino.CPP文件

    LTC6946 Lduino.CPP文件
    发表于 06-07 19:54 3次下载
    LTC6946 Lduino.<b class='flag-5'>CPP</b>文件

    LTC2473-Lduino.CPP文件

    LTC2473-Lduino.CPP文件
    发表于 06-08 19:12 1次下载
    LTC2473-Lduino.<b class='flag-5'>CPP</b>文件

    LTC2484 Lduino.CPP文件

    LTC2484 Lduino.CPP文件
    发表于 06-08 19:19 8次下载
    LTC2484 Lduino.<b class='flag-5'>CPP</b>文件

    LTC1859 Lduino.CPP文件

    LTC1859 Lduino.CPP文件
    发表于 06-08 19:25 3次下载
    LTC1859 Lduino.<b class='flag-5'>CPP</b>文件

    (远程控制)App inventor 编写安卓app控制 ESP8266

    App inventor 编写安卓app控制 ESP8266第一 下载ESP8266示例(arduino ide 编程开发)第二 修改demo例程第三 app inventor 开发原
    发表于 12-08 17:06 28次下载
    (远程控制)<b class='flag-5'>App</b> inventor <b class='flag-5'>编写</b>安卓<b class='flag-5'>app</b>控制 ESP8266