Prefácio
Como mencionado da última vez, a eficiência de desenvolvimento do uso de `C++` para escrever a interface `UI` não é tão alta quanto a de `JS+HTML`, mas o desenvolvimento de dispositivos inevitavelmente requer a operação do hardware por meio do estado do kernel. Aqui devemos primeiro livre-se do problema de `JS A conexão entre a estrutura e o driver de dispositivo. Este capítulo é baseado nas tecnologias de `driver HDF` e `JS+CSS+HTML`. Para conteúdo relacionado, você pode revisar ` Desenvolvendo aplicativos de IA com Hongmeng (5) driver HDF fill light` e ` Desenvolvendo aplicativos de IA com Hongmeng ( 6) UI' `Estes dois artigos.
Princípios da estrutura de desenvolvimento de aplicativos JS
No sexto artigo, vivenciamos JS
o processo de utilização da interface de desenvolvimento, aqui está uma análise simples ace
do princípio de implementação.
Vejamos primeiro o diagrama da estrutura: aplicativos da Web, como pequenos programas js bundle
, são primeiro compilados em pacotes e JS Data binding
o mapeamento de objetos é obtido por meio deles. Observer
Um modelo MVVC minimalista é implementado, usado para dividir os DOM
objetos acima em 4 tipos (renderização, dados, folha de estilo, função).O mecanismo de sequestro de dados é usado para montá-los na função de protótipo do observador, respectivamente, e convertê-los em funções.implementar C++
.
Se você olhar o código-fonte, descobrirá que JS
a parte é minimalista, o mecanismo JS a utiliza JerryScript
e cada tag corresponde a uma C++
classe Component
. A maioria das funções são realmente C++
implementadas, incluindo registro e acionamento de eventos, roteamento de páginas, atualizações de controle, tempos limite, operações de arquivos, saída de linha de comando, etc... O encaixe 100% de todas as APIs me lembra um desenho animado.
C++
É muito mais conveniente depois de entrar no domínio. Neste momento ACE
, você ainda está no modo de usuário e pode HDF
usar o mecanismo de mensagem para acessar o kernel. Nada mais é do que uma operação matryoshka envolvida em outra camada de API.
Módulo integrado
Há uma série @system.xxx
de módulos que fornecem recursos de dispositivo para acessar APP, Roteador, Áudio, Sensor, etc. ohos_module_config.h
Define JS框架
o relacionamento correspondente entre o alias do módulo e a função de inicialização do módulo. Entre eles app
, dfx
o router
módulo é obrigatório.
// Config information for built-in JS modules of OHOS platform
const Module OHOS_MODULES[] = {
#ifdef ENABLE_MODULE_REQUIRE_TEST
{"sample", InitSampleModule},
#endif
{"app", InitAppModule},
#ifdef FEATURE_MODULE_AUDIO
{"audio", InitAudioModule},
#endif // FEATURE_MODULE_AUDIO
{"dfx", InitDfxModule},
{"router", InitRouterModule},
#ifdef ENABLE_MODULE_CIPHER
{"cipher", InitCipherModule},
#endif
};
Implementar módulo ace
Após apresentar o conhecimento prévio, você pode encapsular as funções do módulo ace customizado de acordo com a complexidade do negócio. Para simplificar a operação, montamos a operação diretamente app
no módulo integrado.
1. Defina arquivos de cabeçalho
Modifique foundation/ace/frameworks/lite/src/core/modules/app_module.h
, adicione ToggleLed
funções e inicialize.
namespace OHOS {
namespace ACELite {
class AppModule final : public MemoryHeap {
public:
static JSIValue ToggleLed(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum);
void InitAppModule(JSIValue exports)
{
JSI::SetModuleAPI(exports, "getInfo", AppModule::GetInfo);
JSI::SetModuleAPI(exports, "terminate", AppModule::Terminate);
JSI::SetModuleAPI(exports, "toggleLed", AppModule::ToggleLed);
}
} // namespace ACELite
} // namespace OHOS
#endif // OHOS_ACELITE_APP_MODULE_H
2. Ligue para o driver HDF
Participe foundation/ace/frameworks/lite/src/core/modules/app_module.cpp
,
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"
#define LED_WRITE_READ 1
#define LED_SERVICE "led_service"
JSIValue AppModule::ToggleLed(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
{
HILOG_ERROR(HILOG_MODULE_ACE, "led button pressed.");
printf("led button pressed\n");
struct HdfIoService *serv = HdfIoServiceBind(LED_SERVICE, 0);
if (serv == NULL)
{
printf("fail to get service %s\n", LED_SERVICE);
return JSI::CreateUndefined();
}
static struct HdfDevEventlistener listener = {
.callBack = OnDevEventReceived,c
.priv = (void *)"Service0"};
if (HdfDeviceRegisterEventListener(serv, &listener) != HDF_SUCCESS)
{
printf("fail to register event listener\n");
return JSI::CreateUndefined();
}
const char *send_cmd = "toggle LED";
if (SendEvent(serv, send_cmd))
{
printf("fail to send event\n");
return JSI::CreateUndefined();
}
if (HdfDeviceUnregisterEventListener(serv, &listener))
{
printf("fail to unregister listener\n");
return JSI::CreateUndefined();
}
HdfIoServiceRecycle(serv);
return JSI::CreateUndefined();
}
3. Configure o caminho do arquivo de cabeçalho HDF
Reverfoundation/ace/frameworks/lite/src/core/modules/BUILD.gn
include_dirs = [
"presets",
"maplejs",
"//test/lite/testservice/include",
"//vendor/huawei/watchgt/devkit/hal/include",
"//foundation/distributedschedule/interfaces/innerkits/samgr_lite/communication/mpc/transport",
"//foundation/distributedschedule/interfaces/innerkits/samgr_lite/communication/mpc",
"//drivers/hdf/lite/include/host",
"$HDF_FRAMEWORKS/ability/sbuf/include",
"$HDF_FRAMEWORKS/core/shared/include",
"$HDF_FRAMEWORKS/core/host/include",
"$HDF_FRAMEWORKS/core/master/include",
"$HDF_FRAMEWORKS/include/core",
"$HDF_FRAMEWORKS/include/utils",
"$HDF_FRAMEWORKS/utils/include",
"$HDF_FRAMEWORKS/include/osal",
"$HDF_FRAMEWORKS/adapter/syscall/include",
"$HDF_FRAMEWORKS/adapter/vnode/include",
]
Reverfoundation/ace/frameworks/lite/BUILD.gn
config("ace_lite_config") {
include_dirs = [
...
]
include_dirs += [
"//drivers/hdf/lite/include/host",
"$HDF_FRAMEWORKS/ability/sbuf/include",
"$HDF_FRAMEWORKS/core/shared/include",
"$HDF_FRAMEWORKS/core/host/include",
"$HDF_FRAMEWORKS/core/master/include",
"$HDF_FRAMEWORKS/include/core",
"$HDF_FRAMEWORKS/include/utils",
"$HDF_FRAMEWORKS/utils/include",
"$HDF_FRAMEWORKS/include/osal",
"$HDF_FRAMEWORKS/adapter/syscall/include",
"$HDF_FRAMEWORKS/adapter/vnode/include",
]
}
shared_library("ace_lite") {
public_deps = [
"//base/security/frameworks/crypto_lite/js/builtin:ace_kit_cipher",
"//foundation/graphic/lite/frameworks/surface:surface",
"//foundation/multimedia/frameworks/camera_lite:camera",
"//foundation/multimedia/frameworks/player_lite:player",
"//foundation/multimedia/interfaces/kits/player_lite/js/builtin:audio_api",
"//third_party/bounds_checking_function:libsec_shared",
"//third_party/cJSON:cjson_shared",
"//third_party/jerryscript/jerry-core:jerry-core_shared",
"//third_party/jerryscript/jerry-ext:jerry-ext_shared",
"//third_party/jerryscript/jerry-libm:jerry-libm_shared",
"//third_party/jerryscript/jerry-port/default:jerry-port-default_shared",
"//utils/native/lite/js/builtin:ace_utils_kits",
"//utils/native/lite/timer_task:ace_kit_timer",
"//drivers/hdf/lite/manager:hdf_core",
"//drivers/hdf/lite/adapter/osal/posix:hdf_posix_osal",
]
}
4. Compilar e gravar
python build.py my_hi3516dv300 -b debug
Quando se trata de HDF
drivers e ACE
frameworks, o arquivo de imagem deve ser gravado completamente novamente.
Desenvolver programa de interface
1. Configure a interface do módulo
Anteriormente, app
adicionamos funções ao módulo integrado taggleLed
, que DevEco Studio
não pode ser obtido diretamente para Python, portanto, precisamos api
primeiro adicionar uma interface.
Modificar \Huawei\Sdk\js\2.0.1.93\api\smartVision\@system.app.d.ts
arquivos
export default class App {
/**
* Obtains the declared information in the config.json file of an application.
*/
static getInfo(): IAppInfo;
/**
* Destroys the current ability.
*/
static terminate(): void;
/**
* 翻转Led
*/
static toggleLed(): void;
}
2. Gatilho de página
Aqui UI篇
usamos um evento deslizante no programa anterior para acionar a operação de inversão do Led.
Reverentry/src/main/js/default/pages/index/index.js
swiperChange (e) {
this.swiperPage = e.index;
if(e.index == 0){
this.iconcheckedColor = '#ffffff';
this.iconUncheckedColor = '#262626';
}else{
this.iconcheckedColor = '#262626';
this.iconUncheckedColor = '#ffffff';
}
// 调用翻转Led函数
app.toggleLed();
}
O toggleLed
nome da função deve corresponder ao nome da string definido ace
no registro de inicialização do módulo anterior .JSI::SetModuleAPI
3. Empacotar no Hap
Empacote o aplicativo como Hap
renomeadoMyUILed.hap
4. Instale no dispositivo
Para o nfs
diretório de mapeamento específico, consulte o capítulo anterior.
mkdir nfs
mount 192.168.1.52:/nfs /nfs nfs
cd nfs
./dev_tools/bin/bm set -s disable
./dev_tools/bin/bm install -p MyUILed.hap
5. Execute o programa
Deslize a interface principal e veja Led灯
a opção, o que significa que o programa está sendo executado com sucesso.
Para resumir brevemente todo o processo,
Página principal
index
,import app from '@system.app'
módulo de importação;Chamado em um evento
app.toggleLed();
para iniciar uma operação;Por
JS框架
embalagemMyUILed.hap
(essencialmente um pacote zip);Depois de instalado no dispositivo, ele é descompactado e restaurado em formato
JS代码
;A estrutura no dispositivo
ace
passaJSI::SetModuleAPI
eJS代码
as palavras-chave são"toggleLed"
mapeadas para asC++
funções correspondentesAppModule::ToggleLed
;AppModule::ToggleLed
Encontrado na funçãoLED_SERVICE
, enviarHDF
mensagemDepois que o driver no kernel
HDF
recebe a mensagem, ele realmente a executaLED翻转操作
.
Neste ponto, podemos ter o melhor dos dois mundos: podemos não apenas construir UI
peças bonitas com eficiência em um pequeno programa, mas também acessar C++
com eficiência as funções subjacentes do dispositivo, o que AI
abre caminho para um grande número de tarefas subsequentes. cálculos intensivos.
Download
Documentos e informações relevantes para este problema podem ser encontrados na conta pública “Deep Awakening” e responda: “ohos08” em segundo plano para obter o link de download.
Visualização do próximo artigo
DevEco Device Tools 2.0 atualizado recentemente,
Integra muitos comandos hpm e hos,
No próximo artigo, vamos testar primeiro a nova versão da ferramenta de gravação.
Fique atento...
Recomendado no passado