Honmeng を使用して AI アプリケーションを開発する (8) カーネル層にアクセスするための JS フレームワーク

序文

前回述べたように、「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モデルを実装していますObserverDOM機能C++を実装します。

JSソースコードを見ると、その部分は最小限であり、JS エンジンがそれを使用しJerryScript、各タグがC++クラスに対応していることがわかりますComponentC++イベントの登録とトリガー、ページ ルーティング、コントロールの更新、タイムアウト、ファイル操作、コマンド ライン出力など、ほとんどの機能が実際に実装されています...すべての API が 100% ドッキングされていると、漫画を思い出します

ドメインに入ったC++後は、はるかに便利です。この時点ではACE、まだユーザー モードであり、メッセージ メカニズムをHDF使用して。これは、API の別の層にラップされたマトリョーシカ操作にすぎません。

内蔵モジュール

@system.xxxAPP、ルーター、オーディオ、センサーなどにアクセスするためのデバイス機能を提供する一連のモジュールがあります。モジュールのエイリアスとモジュール初期化関数の対応関係をohos_module_config.h定義します。JS框架このうちappdfxrouterモジュールが必要です。

// 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.hToggleLed機能を追加し、初期化します。

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 StudioPython では直接取得できないため、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::SetModuleAPIJS代码キーワードが"toggleLed"対応するC++機能にマッピングされますAppModule::ToggleLed

  • AppModule::ToggleLed関数で見つかりましたLED_SERVICEHDFメッセージを送信します

  • カーネル内のドライバーはHDFメッセージを受信すると、実際にそれを実行しますLED翻转操作

この時点で、両方の長所を利用することができます。UI小さなプログラムのような方法で美しいパーツを効率的に構築できるだけでなく、デバイスの基礎となる機能にC++効率的にアクセスできるため、AIその後の多数の機能への道が開かれます。集中的な計算。

ダウンロード

この問題に関連する文書と情報は、公開アカウント「Deep Awakening」で見つけることができ、バックグラウンドで「ohos08」と返信してダウンロード リンクを入手してください。

次の記事のプレビュー

最近更新された DevEco Device Tools 2.0、

多くの hpm および hos コマンドを統合し、

次の記事では、まず新しいバージョンの書き込みツールを試してみましょう。

乞うご期待...

過去におすすめしたもの

おすすめ

転載: blog.csdn.net/weixin_47479625/article/details/113733673