0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用cpp編寫(xiě)用于小型系統(tǒng)的app

OpenHarmony技術(shù)社區(qū) ? 來(lái)源:OpenHarmony技術(shù)社區(qū) ? 2023-04-25 09:47 ? 次閱讀

本文將介紹如何使用 cpp 編寫(xiě)用于小型系統(tǒng)的 app。

Ability相關(guān)介紹

Ability 是應(yīng)用所具備能力的抽象,也是應(yīng)用程序的重要組成部分。Ability 是系統(tǒng)調(diào)度應(yīng)用的最小單元,是能夠完成一個(gè)獨(dú)立功能的組件。

一個(gè)應(yīng)用可以包含一個(gè)或多個(gè) Ability。其中 Ability 又分為 Page 類(lèi)型的和 Service 類(lèi)型的,前者是為用戶(hù)提供人機(jī)交互能力的,后者是提供后臺(tái)任務(wù)機(jī)制的。

簡(jiǎn)單來(lái)講就是 Page 帶界面,Service 不帶界面。這里將重點(diǎn)介紹 Page 類(lèi)型的 Ability。

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

使用到的子系統(tǒng)有 Ability 子系統(tǒng)、包管理子系統(tǒng)和圖形 UI 子系統(tǒng)。

Ability 子系統(tǒng)是管理 OpenHarmony 應(yīng)用運(yùn)行狀態(tài)的開(kāi)發(fā)框架;包管理子系統(tǒng)是 OpenHarmony 為開(kāi)發(fā)者提供的安裝包管理框架;圖形 UI 子系統(tǒng)提供基礎(chǔ) UI 組件和容器類(lèi)組件。

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

簡(jiǎn)單實(shí)現(xiàn)

①ability 和 abilityslice

abilityslice 是單個(gè)頁(yè)面及其控制邏輯的總和,是 Page 類(lèi)型 Ability 特有的組件。

一個(gè) Page 類(lèi)型的 Ability 可以包含多個(gè) AbilitySlice,此時(shí),這些頁(yè)面提供的業(yè)務(wù)能力應(yīng)當(dāng)是高度相關(guān)的。dfe6c1c0-e307-11ed-ab56-dac502259ad0.png

②生命周期

整體流程下來(lái)大致有 OnStart()、OnAvtive()、OnInactive()、OnBackground() 和 OnStop() 五階段。

abilityslice 生命周期與 ability 相似,但是仍要區(qū)分。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
首先定義并注冊(cè) 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結(jié)構(gòu)體,ability的相關(guān)信息
/*
*由于在這里我們只要簡(jiǎn)單的展示helloworld標(biāo)簽,其它函數(shù)不需要重載。
*/
//voidOnInactive()override;
//voidOnActive(constWant&want)override;
//voidOnBackground()override;
//voidOnStop()override;
};
}

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

namespaceOHOS{
REGISTER_AA(MainAbility)//使用REGISTER_AA注冊(cè)ability

voidMainAbility::OnStart(constWant&want)
{
printf("ThisisMainAbilityOnStartstatus!
");
SetMainRoute("MainAbilitySlice");//設(shè)置主頁(yè)面為MainAbilitySlice,這要與后續(xù)的slice名字匹配

Ability::OnStart(want);
}
}

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

最后編寫(xiě) 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{//創(chuàng)建AbilitySlice類(lèi)與上面同名
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();//創(chuàng)建底層界面
rootView_->SetPosition(0,0,screen_width,screen_height);
rootView_->SetStyle(STYLE_BACKGROUND_COLOR,Color::Black()));
rootView_->SetFocusable(true);
rootView_->SetInterceptFocus(false);

UILabel*label=newUILabel();//創(chuàng)建label寫(xiě)入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_);//設(shè)置顯示RootViewUI
}
}
#endif

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

④config.json 的編寫(xiě)

//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編譯

①通過(guò) BUILD.gn 與系統(tǒng)一并編譯

使用到編譯鏈中的 hap_pack,添加配置:

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

shared_library("hello"){
sources=[
"src/main/main_ability.cpp",
"src/main/main_ability_slice.cpp"
]#將主要文件編譯出庫(kù)

deps=[
"${aafwk_lite_path}/frameworks/ability_lite:aafwk_abilitykit_lite",
"${appexecfwk_lite_path}/frameworks/bundle_lite:bundle",
"http://foundation/graphic/ui:lite_ui",
"http://foundation/graphic/utils:lite_graphic_utils",
"http://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",
]#添加依賴(lài)

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"#編譯后的庫(kù)文件
force="true"
cert_profile="com.huawei.launcher_AppProvision_release.p7b"#由于不清楚獲取證書(shū)方法先用源碼案例自帶的證書(shū)代替
resources_path="resources"
hap_name="hello"
}

②通過(guò) app_packing_tool 單獨(dú)編譯

該打包工具在源碼目錄 developtools/packing_tool/jar 下。

主要參數(shù)如下:

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

具體操作:還是得先將動(dòng)態(tài)庫(kù)編譯出來(lái),然后將動(dòng)態(tài)庫(kù) libhello.so 和 config.json 放到一個(gè)文件夾里。
./out/
├──config.json
└──libhello.so
最后使用 java -jar app_packing_tool.jar 進(jìn)行打包,如下:
java-jarapp_packing_tool.jar|
--modehap|
--json-path./config.json|
--ability-out-path./libhello.so|
--out-path./hello.hap

hap安裝

①安裝命令 bm

由于小型系統(tǒng)不支持使用 HDC 工具,我們需要使用到 bm 命令進(jìn)行安裝程序。
bmset-sdisable//取消簽名安裝。
bminstall-psystem/internal/hello.hap//使用BUILD.gn一起編譯的hap默認(rèn)會(huì)在這個(gè)路徑,如果使用工具打包的,視情況填寫(xiě)路徑。

②相關(guān)參數(shù)

#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

小型系統(tǒng)的 bm 指令是標(biāo)準(zhǔn)系統(tǒng)的閹割版。

安裝成功后就可以打開(kāi)該 app,部分小型系統(tǒng)的設(shè)備屏幕沒(méi)有觸摸功能和鼠標(biāo)驅(qū)動(dòng),我們可以使用 aa 命令來(lái)啟動(dòng) 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

總結(jié)

使用 cpp 編寫(xiě)用戶(hù)應(yīng)用程序,我們可以更方便有效的調(diào)用南向接口,這將會(huì)在開(kāi)發(fā)和調(diào)試的過(guò)程中給我們帶來(lái)極大的便利。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • APP
    APP
    +關(guān)注

    關(guān)注

    33

    文章

    1562

    瀏覽量

    72270
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3223

    瀏覽量

    57504
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3611

    瀏覽量

    15960

原文標(biāo)題:OpenHarmony上編寫(xiě)app

文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++程序的結(jié)構(gòu)特性

    全面兼容C,C的許多代碼不經(jīng)修改就可以為Cpp所用,用C編寫(xiě)的庫(kù)函數(shù)和實(shí)用軟件可以用于Cpp。
    發(fā)表于 09-19 11:19 ?592次閱讀

    請(qǐng)問(wèn)keil編寫(xiě)的BootLoader可以跳轉(zhuǎn)到GCC編寫(xiě)APP里嗎?

    keil編寫(xiě)的BootLoader 可以跳轉(zhuǎn)到 GCC編寫(xiě)APP里嗎?
    發(fā)表于 04-18 07:00

    idf4.4在cmakelists中設(shè)置了main.cpp依然找不到app_main ?為什么?

    ./Src/main.cpp ./Src/ringbufferUart.cpp ./Src/app_tasks.cpp ./Src/md5.cpp ./Src/util.
    發(fā)表于 06-17 07:42

    CPP和C共存的訣竅是什么?

    CPP和C共存的訣竅是什么?我有一個(gè)使用數(shù)學(xué)函數(shù)的單獨(dú)的CPP庫(kù)。主C程序使用CPP LIB。對(duì)于主項(xiàng)目的標(biāo)準(zhǔn)編譯失敗了許多對(duì)CPP數(shù)學(xué)函數(shù)的未定義的引用,例如,如果我添加了LIXXC
    發(fā)表于 01-22 14:49

    Stm32的bootloader和App編寫(xiě)注意事項(xiàng)有哪些?

    Stm32的bootloader和App編寫(xiě)注意事項(xiàng)有哪些?如何使用STM32F4的BootLoader和APP程序?
    發(fā)表于 10-29 07:35

    如何利用App inventor編寫(xiě)安卓app控制ESP8266?

    如何利用App inventor編寫(xiě)安卓app控制ESP8266?
    發(fā)表于 02-11 07:04

    OpenHarmony輕量與小型系統(tǒng)入門(mén)概述

    簡(jiǎn)介 OpenHarmony輕量和小型系統(tǒng)用于內(nèi)存較小的IOT設(shè)備(參考內(nèi)存≥128KiB)。通過(guò)本文,開(kāi)發(fā)者可以快速熟悉OpenHarmony輕量和小型
    發(fā)表于 05-06 15:48

    idf4.4在cmakelists.txt中設(shè)置了main.cpp依然找不到app_main是為什么?

    /main.cpp./Src/ringbufferUart.cpp./Src/app_tasks.cpp./Src/md5.cpp./Src/util.
    發(fā)表于 02-14 06:36

    嵌入式小型TCPIP協(xié)議棧

    一個(gè)專(zhuān)為嵌入式系統(tǒng)編寫(xiě)小型TCP/IP協(xié)議棧 TCP/IPLean
    發(fā)表于 10-08 17:23 ?50次下載

    一個(gè)專(zhuān)為嵌入式系統(tǒng)編寫(xiě)小型TCP IP協(xié)議棧

    一個(gè)專(zhuān)為嵌入式系統(tǒng)編寫(xiě)小型TCP IP協(xié)議棧
    發(fā)表于 02-08 01:38 ?17次下載

    LTC6946 Lduino.CPP文件

    LTC6946 Lduino.CPP文件
    發(fā)表于 06-07 19:54 ?3次下載
    LTC6946 Lduino.<b class='flag-5'>CPP</b>文件

    LTC2473-Lduino.CPP文件

    LTC2473-Lduino.CPP文件
    發(fā)表于 06-08 19:12 ?1次下載
    LTC2473-Lduino.<b class='flag-5'>CPP</b>文件

    LTC2484 Lduino.CPP文件

    LTC2484 Lduino.CPP文件
    發(fā)表于 06-08 19:19 ?8次下載
    LTC2484 Lduino.<b class='flag-5'>CPP</b>文件

    LTC1859 Lduino.CPP文件

    LTC1859 Lduino.CPP文件
    發(fā)表于 06-08 19:25 ?3次下載
    LTC1859 Lduino.<b class='flag-5'>CPP</b>文件

    (遠(yuǎn)程控制)App inventor 編寫(xiě)安卓app控制 ESP8266

    App inventor 編寫(xiě)安卓app控制 ESP8266第一 下載ESP8266示例(arduino ide 編程開(kāi)發(fā))第二 修改demo例程第三 app inventor 開(kāi)發(fā)原
    發(fā)表于 12-08 17:06 ?28次下載
    (遠(yuǎn)程控制)<b class='flag-5'>App</b> inventor <b class='flag-5'>編寫(xiě)</b>安卓<b class='flag-5'>app</b>控制 ESP8266