精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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("http://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",
"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",
]#添加依賴

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

    文章

    1569

    瀏覽量

    72386
  • 應用程序
    +關注

    關注

    37

    文章

    3245

    瀏覽量

    57615
  • OpenHarmony
    +關注

    關注

    25

    文章

    3665

    瀏覽量

    16163

原文標題:OpenHarmony上編寫app

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C++程序的結構特性

    全面兼容C,C的許多代碼不經修改就可以為Cpp所用,用C編寫的庫函數和實用軟件可以用于Cpp
    發表于 09-19 11:19 ?700次閱讀

    請問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