序文
前回述べたように、「C++」を使用して「UI」インターフェースを記述する場合の開発効率は「JS+HTML」ほど高くありませんが、デバイス開発では必然的にカーネル状態を介してハードウェアを操作する必要があります。 `JS フレームワークとデバイス ドライバー間の接続の問題を解決します。この章は「HDF ドライバー」と「JS+CSS+HTML」のテクノロジーに基づいています。関連する内容については、「Hongmeng を使用した AI アプリケーションの開発 (5) HDF ドライバー補助光」および「Hongmeng を使用した AI アプリケーションの開発 ( 6) UI' `この2つの記事です。
JS アプリケーション開発フレームワークの原則
第 6 回ではJS
開発インターフェースの使用プロセスを体験しましたが、ここではace
実装原理を簡単に分析します。
まずフレームワーク図を見てみましょう. 小さなプログラムのような Web アプリケーションは、最初にjs bundle
パッケージにコンパイルされ、JS Data binding
それを通じてオブジェクト マッピングが取得されます。上記のオブジェクトを4種類(render、data、styleSheet、function)に分割し、データハイジャック機構を用いてそれぞれオブザーバーのプロトタイプ関数に実装し、変換するミニマルなMVVCモデルを実装していますObserver
。DOM
機能C++
を実装します。
JS
ソースコードを見ると、その部分は最小限であり、JS エンジンがそれを使用しJerryScript
、各タグがC++
クラスに対応していることがわかりますComponent
。C++
イベントの登録とトリガー、ページ ルーティング、コントロールの更新、タイムアウト、ファイル操作、コマンド ライン出力など、ほとんどの機能が実際に実装されています...すべての API が 100% ドッキングされていると、漫画を思い出します。
ドメインに入ったC++
後は、はるかに便利です。この時点ではACE
、まだユーザー モードであり、メッセージ メカニズムをHDF
使用して。これは、API の別の層にラップされたマトリョーシカ操作にすぎません。
内蔵モジュール
@system.xxx
APP、ルーター、オーディオ、センサーなどにアクセスするためのデバイス機能を提供する一連のモジュールがあります。モジュールのエイリアスとモジュール初期化関数の対応関係をohos_module_config.h
定義します。JS框架
このうちapp
、dfx
、router
モジュールが必要です。
// 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
};
aceモジュールを実装する
予備知識を導入した後は、業務の複雑さに応じてカスタム ace モジュールの機能をカプセル化し、操作を簡素化するために、組み込みモジュールに直接実装しますapp
。
1. ヘッダーファイルを定義する
を修正しfoundation/ace/frameworks/lite/src/core/modules/app_module.h
、ToggleLed
機能を追加し、初期化します。
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. HDFドライバーを呼び出す
参加してください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. HDF ヘッダー ファイル パスの構成
改訂foundation/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",
]
改訂foundation/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. コンパイルと書き込み
python build.py my_hi3516dv300 -b debug
HDF
ドライバーとフレームワークに関してはACE
、イメージ ファイルを完全に再度書き込む必要があります。
インターフェースプログラムの開発
1. モジュールインターフェースの設定
先ほど、app
組み込みモジュールに関数を追加しましたがtaggleLed
、これはDevEco Studio
Python では直接取得できないため、api
最初にインターフェイスを追加する必要があります。
\Huawei\Sdk\js\2.0.1.93\api\smartVision\@system.app.d.ts
ファイルを変更する
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. ページトリガー
ここでは、UI篇
前のプログラムでスライド イベントを使用して、LED を反転する操作をトリガーします。
改訂entry/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();
}
関数toggleLed
名は、ace
前のモジュール初期化登録でJSI::SetModuleAPI
定義された文字列名と一致する必要があります。
3. Hapへのパッケージ化
Hap
名前を変更したアプリケーションをパッケージ化するMyUILed.hap
4. デバイスにインストールする
特定のnfs
マッピング ディレクトリについては、前の章を参照してください。
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. プログラムを実行する
メイン インターフェイスをスライドするとLed灯
スイッチが表示されます。これは、プログラムが正常に実行されていることを意味します。
全体のプロセスを簡単に要約すると、
メインページ
index
、インポートimport app from '@system.app'
モジュール;app.toggleLed();
操作を開始するためにイベントで呼び出されます。JS框架
パッケージ化MyUILed.hap
(基本的に zip パッケージ)による。デバイスにインストールされると、解凍されて ; に復元されます
JS代码
。デバイス上のフレームワークが
ace
通過しJSI::SetModuleAPI
、JS代码
キーワードが"toggleLed"
対応するC++
機能にマッピングされますAppModule::ToggleLed
。AppModule::ToggleLed
関数で見つかりましたLED_SERVICE
。HDF
メッセージを送信しますカーネル内のドライバーは
HDF
メッセージを受信すると、実際にそれを実行しますLED翻转操作
。
この時点で、両方の長所を利用することができます。UI
小さなプログラムのような方法で美しいパーツを効率的に構築できるだけでなく、デバイスの基礎となる機能にC++
効率的にアクセスできるため、AI
その後の多数の機能への道が開かれます。集中的な計算。
ダウンロード
この問題に関連する文書と情報は、公開アカウント「Deep Awakening」で見つけることができ、バックグラウンドで「ohos08」と返信してダウンロード リンクを入手してください。
次の記事のプレビュー
最近更新された DevEco Device Tools 2.0、
多くの hpm および hos コマンドを統合し、
次の記事では、まず新しいバージョンの書き込みツールを試してみましょう。
乞うご期待...
過去におすすめしたもの