Prefacio
Como se mencionó la última vez, la eficiencia de desarrollo del uso de "C++" para escribir la interfaz "UI" no es tan alta como la de "JS+HTML", pero el desarrollo de dispositivos requiere inevitablemente operar el hardware a través del estado del kernel. Aquí primero debemos elimine el problema de `JS La conexión entre el marco y el controlador del dispositivo. Este capítulo se basa en las tecnologías de "controlador HDF" y "JS+CSS+HTML". Para contenido relacionado, puede revisar " Desarrollo de aplicaciones de IA con Hongmeng (5) Luz de relleno del controlador HDF" y " Desarrollo de aplicaciones de IA con Hongmeng ( 6) UI' `Estos dos artículos.
Principios del marco de desarrollo de aplicaciones JS
En el sexto artículo, experimentamos JS
el proceso de uso de la interfaz de desarrollo, aquí hay un análisis simple ace
del principio de implementación.
Primero veamos el diagrama del marco: las aplicaciones web, como los programas pequeños, primero se compilan en js bundle
paquetes y JS Data binding
el mapeo de objetos se obtiene a través de ellos. Observer
Se implementa un modelo MVVC minimalista, que se utiliza para dividir los DOM
objetos anteriores en 4 tipos (renderizado, datos, hoja de estilo, función), y el mecanismo de secuestro de datos se utiliza para montarlos en la función prototipo del observador respectivamente y convertirlos en funciones C++
implementar.
Si miras el código fuente, encontrarás que JS
la parte es minimalista, el motor JS la usa JerryScript
y cada etiqueta corresponde a una C++
clase Component
. La mayoría de las funciones están realmente C++
implementadas, incluido el registro y activación de eventos, enrutamiento de páginas, actualizaciones de control, tiempos de espera, operaciones de archivos, salida de línea de comando, etc. El acoplamiento del 100% de todas las API me recuerda a una caricatura.
C++
Es mucho más conveniente después de ingresar al dominio. En este momento ACE
, todavía estás en modo de usuario y puedes HDF
usar el mecanismo de mensajes para llegar al kernel. No es más que una operación de matrioska envuelta en otra capa de API.
Módulo incorporado
Hay una serie @system.xxx
de módulos que brindan capacidades al dispositivo para acceder a APP, enrutador, audio, sensor, etc. ohos_module_config.h
Define JS框架
la relación correspondiente entre el alias del módulo y la función de inicialización del módulo. Entre ellos app
, dfx
se router
requiere módulo.
// 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 as
Después de introducir los conocimientos previos, puede encapsular las funciones del módulo ace personalizado de acuerdo con la complejidad del negocio. Para simplificar la operación, montamos la app
operación directamente en el módulo incorporado.
1. Definir archivos de encabezado
Modificar foundation/ace/frameworks/lite/src/core/modules/app_module.h
, agregar ToggleLed
funciones e inicializar.
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. Llame al controlador HDF
Únete 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 la ruta del archivo de encabezado HDF
Revisarfoundation/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",
]
Revisarfoundation/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 y grabar
python build.py my_hi3516dv300 -b debug
En lo que respecta a HDF
controladores y ACE
marcos, el archivo de imagen debe volver a grabarse por completo.
Desarrollar programa de interfaz.
1. Configurar la interfaz del módulo
Anteriormente, app
agregamos funciones al módulo integrado taggleLed
, que DevEco Studio
no se pueden obtener directamente para Python, por lo que primero debemos agregar api
una interfaz.
Modificar \Huawei\Sdk\js\2.0.1.93\api\smartVision\@system.app.d.ts
archivos
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. Activador de página
Aquí UI篇
usamos un evento deslizante en el programa anterior para activar la operación de voltear el Led.
Revisarentry/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();
}
El toggleLed
nombre de la función debe coincidir con el nombre de la cadena definido ace
en el registro de inicialización del módulo anterior .JSI::SetModuleAPI
3. Empaquetar en Hap
Empaquetar la aplicación con el Hap
nombre renombradoMyUILed.hap
4. Instalar en el dispositivo
Para conocer el directorio de mapeo específico nfs
, consulte el 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. Ejecute el programa
Deslice la interfaz principal y vea Led灯
el interruptor, lo que significa que el programa se está ejecutando correctamente.
Para resumir brevemente todo el proceso,
Página principal
index
,import app from '@system.app'
módulo de importación;Llamado en un evento
app.toggleLed();
para iniciar una operación;Por
JS框架
embalajeMyUILed.hap
(esencialmente un paquete zip);Una vez instalado en el dispositivo, se descomprime y se restaura en
JS代码
;El marco del dispositivo
ace
pasaJSI::SetModuleAPI
yJS代码
las palabras clave"toggleLed"
se asignan a lasC++
funciones correspondientesAppModule::ToggleLed
;AppModule::ToggleLed
Encontrado en funciónLED_SERVICE
, enviarHDF
mensajeDespués de que el controlador del kernel
HDF
recibe el mensaje, lo ejecutaLED翻转操作
.
En este punto, podemos tener lo mejor de ambos mundos: no solo podemos construir de manera eficiente hermosas UI
piezas en forma de un pequeño programa, sino también acceder C++
de manera eficiente a las funciones subyacentes del dispositivo, lo que AI
allana el camino para una gran cantidad de posteriores. Cálculos intensivos.
Descargar
Puede encontrar información y documentos relevantes para este problema en la cuenta pública "Deep Awakening" y responda: "ohos08" en segundo plano para obtener el enlace de descarga.
Vista previa del artículo siguiente
Herramientas de dispositivo DevEco 2.0 recientemente actualizadas,
Integra muchos comandos hpm y hos,
En el próximo artículo, primero probaremos la nueva versión de la herramienta de grabación.
Manténganse al tanto...
Recomendado en el pasado