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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

HarmonyOS如何自動生成JS FA調用Java PA的模板代碼

HarmonyOS開發者 ? 來源:HarmonyOS開發者 ? 作者:guxinmeng ? 2021-09-28 10:09 ? 次閱讀

JS UI框架提供了JS FA(Feature Ability)調用Java PA(Particle Ability)的機制,該機制提供了一種通道來傳遞方法調用、處理數據返回以及訂閱事件上報。

在往期的《JS UI框架下FA與PA是如何交互的》一文中,給大家介紹了如何通過利用FA、PA交互機制來完成基于JS UI框架的應用開發。但是,開發者在實操過程中,都遇到一個共同的問題,就是需要手動撰寫大量模板代碼,且模板代碼可能與業務代碼相互耦合,使得代碼可維護性和可讀性較差。于是,js2java-codegen工具應運而生。

本期,小編將通過開發一個簡單的計算器應用,闡述JS UI框架下,如何使用js2java-codegen工具自動生成JS FA調用Java PA的模板代碼。

注:以下內容中涉及到的 “FA調用PA”,均是指JS UI框架下JS FA調用Java PA。

js2java-codegen是HarmonyOS SDK中Toolchains工具鏈從2.2.0.3版本開始提供的自動生成FA調用PA代碼的輔助開發工具。它可以根據用戶源碼自動生成FA調用PA時所需的Java和JS模板代碼,該模板代碼與用戶編寫的業務代碼相互分離,降低了代碼的耦合。

目前,js2java-codegen工具所支持的FA調用PA實現方式為InternalAbility類型,Ability類型尚不支持。

說明 :當前JS FA調用Java PA的機制中,提供了Ability和InternalAbility兩種調用方式:

Ability:擁有獨立的Ability生命周期,FA使用遠端進程通信拉起并請求PA服務,適用于基本服務供多FA調用或者服務在后臺獨立運行的場景。

InternalAbility:與FA共進程,采用內部函數調用的方式和FA進行通信,適用于對服務響應時延要求較高的場景。該方式下PA不支持其他FA訪問調用。

更多JS FA調用Java PA的機制官網文檔

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-js-fa-call-pa-0000001050435961

由于該工具從HarmonyOS SDK中Toolchains的2.2.0.3版本開始支持,所以請先把DevEco Studio更新至最新的2.2 Beta2版本。

DevEco Studio官網下載鏈接:

https://developer.harmonyos.com/cn/develop/deveco-studio#download

1. 新建工程

最新版的DevEco Studio 2.2 Beta2下,新建一個包含JS的手機項目。

2. 工具配置

開發者需在進行代碼生成模塊下的build.gradle中進行編譯設置及開關控制。編譯參數位于ohos -》 defaultConfig下,開發者需用以下方式設置JS模板代碼生成路徑,即‘jsOutputDir’對應的值。代碼如下:

// 定義JS模板生成路徑def jsOutputDir = project.file(“src/main/js/default/generated”).toString()ohos { defaultConfig { javaCompileOptions { annotationProcessorOptions { // JS模板代碼生成路徑賦值 arguments = [‘jsOutputDir’: jsOutputDir] } } }}

工具開關位于ohos下,值設為true則啟用工具,false或不進行配置則不啟用工具。配置代碼如下:

ohos { compileOptions { // 此處為啟用js2java-codegen工具的開關。值為true則啟用工具,false則不啟用工具。 f2pautogenEnabled true }}

3. PA側代碼編寫

開發者需在PA側用Java語言手動編寫實現計算器業務邏輯的InternalAbility類,用于接收FA側傳來的運算表達式,并對表達式的合法性進行檢驗。然后通過單獨編寫一個工具類來完成對運算表達式的計算,并由InternalAbility來調用,將計算結果返回FA側。本示例中,開發者通過新建CalculateService類實現計算器的業務邏輯,并對CalculateService類本身添加@InternalAbility注解,表示該類為InternalAbility類,并且用參數指定該類注冊到同包中的MainAbility類。然后通過calculate()方法來實現計算器的基本操作,包括入參檢驗、調用工具類實現運算表達式的計算、捕獲異常并返回結果,部分示例代碼如下所示:

package com.example.simplecalculatorfapa;import

com.example.simplecalculatorfapa.utils.Util;import

ohos.annotation.f2pautogen.InternalAbility;import java.util.EmptyStackException;import

java.util.regex.Pattern;// 注冊到同一個包下的MainAbility類中@InternalAbility(registerTo =

“com.example.simplecalculatorfapa.MainAbility”)public class CalculateService { public String

calculate(String exp) { // 排除不需計算就可發現的非法情況,此處列出一種為例 if (exp.isEmpty

()) { return “NoResult”; } // ... // 使用工具類進行計算,捕獲可能出現的異常 String result;

try { result = Util.getResult(exp); } catch (NumberFormatException | ArithmeticException |

EmptyStackException e) { return “Wrong”; } // 返回合法結果 return result; }}

工具注解說明:js2java-codegen工具通過注解來獲取信息并生成開發者所需的代碼。因此用戶如果想使用該工具輔助開發,則需要了解以下三種注解的用法:@InternalAbility注解:類注解,用于被使用作InternalAbility的、包含實際業務代碼的類(簡稱InternalAbility類)。包含一個參數:registerTo,參數值為需要注冊的Ability類全名。

如下用例表示Service類是一個InternalAbility類,注冊到位于com.example包中的、名為Ability的Ability類。@InternalAbility (registerTo = “com.example.Ability”)

public class Service{}@ExportIgnore注解:方法注解,用于InternalAbility類中的某些方法,表示該方法不暴露給JS側來調用,僅對public方法有效。如下用例表示service方法不會被暴露給JS側。@ExportIgnore public int service(int input) {return input;}

@ContextInject注解:用于AbilityContext上的注解。該類由HarmonyOS的Java API提供,開發者可通過它獲取API中提供的信息。如下用例表示開發者可以借助abilityContext對象獲取API中提供的信息。

@ContextInject AbilityContext abilityContext;

4. 編譯

編寫完InternalAbility類的業務代碼后,下面FA調用PA的模板代碼生成工作就交給js2java-codegen工具吧!

開發者只需點擊菜單欄中的Build -》 Build HAP(s)/APP(s) -》 Build HAP(s),即可完成對項目的編譯,同時js2java-codegen工具會在編譯過程中完成FA調用PA通道代碼的生成。 編譯過程會生成Java和JS的模板代碼。

① 自動生成的Java模板代碼位于entry 》 build 》 generated》 source 》 annotation 》 debug 下。部分Java模板代碼如下所示:

public boolean onRemoteRequest(int code,MessageParcel data, MessageParcel reply, MessageOption option) { Map《String, Object》 result = new HashMap《String,Object》(); switch(code) { case OPCODE_calculate:{ java.lang.String zsonStr =data.readString(); ZSONObject

zsonObject =ZSONObject.stringToZSON(zsonStr); java.lang.String exp =zsonObject.getObject(“exp”,java.lang.String.class);

result.put(“code”, SUCCESS); result.put(“abilityResult”,service.calculate(exp)); break;} default:reply.writeString(“Opcode is not defined!”);

return false; } return sendResult(reply,result, option.getFlags() == MessageOption.TF_SYNC);}rivate boolean sendResult(MessageParcel reply,Map《String, Object》 result, boolean isSync) { if (isSync) { reply.writeString(ZSONObject.toZSONString(result)); } else { MessageParcel response =MessageParcel.obtain();

response.writeString(ZSONObject.toZSONString(result)); IRemoteObject remoteReply =reply.readRemoteObject();

try { remoteReply.sendRequest(0, response,MessageParcel.obtain(), new MessageOption()); response.reclaim();

} catch (RemoteExceptionexception) { return false; } } return true;}

② 自動生成的JS模板代碼位于開發者在編譯設置中設置的路徑,名稱與InternalAbility類的名稱相對應。自動生成的JS模板代碼如下所示:

// This file is automatically generated. Do not modify it!const ABILITY_TYPE_EXTERNAL = 0;const ABILITY_TYPE_INTERNAL = 1;

const ACTION_SYNC = 0;const ACTION_ASYNC = 1;const BUNDLE_NAME = ‘com.example.simplecalculatorfapa’;const ABILITY_NAME = ‘com.example.simplecalculatorfapa.CalculateServiceStub’;

const OPCODE_calculate = 0;const sendRequest = async (opcode, data) =》 { var action = {};

action.bundleName = BUNDLE_NAME; action.abilityName = ABILITY_NAME; action.messageCode = opcode; action.data = data; action.abilityType = ABILITY_TYPE_INTERNAL; action.syncOption = ACTION_SYNC; return FeatureAbility.callAbility(action);

}class CalculateService { async calculate(exp) { if (arguments.length != 1) { throw new Error(“Method expected 1 arguments, got ” + arguments.length);

} let data = {}; data.exp = exp; const result = await sendRequest(OPCODE_calculate, data); return JSON.parse(result);

}}export default CalculateService;

5. FA側代碼編寫

FA側的內容包含“由html與css代碼編寫的靜態頁面”及“實現按鈕與方法動態關聯的JS代碼”。首先,開發者需在開頭引入由js2java-codegen工具自動生成的JS模板代碼的FA接口類,然后實現計算器按鈕對應的方法。由于“=”按鈕對應的方法調用了PA側的計算功能,因此需在該方法中新建FA接口示例,并調用對應方法(名稱與InternalAbility類中需要被調用的方法名稱相同),并將輸入框的值傳入,將返回值打印在結果框中。

本示例中,開發者通過在開頭引入由js2java-codegen工具自動生成的JS模板代碼的CalculateService接口類(from后的值需要與編譯設置中的路徑進行統一,JS模板代碼文件名稱與InternalAbility類名相同),然后用data實現輸入框與結果框的動態,并在等號按鈕對應的calculate()方法中新建接口實例,通過調用接口類的calculate()方法,將輸入框值傳入,并把返回值賦給結果框。示例代碼如下所示:

// 引入calculateService類import CalculateService from ‘../../generated/CalculateService.js’;

export default { // 用于實現輸入框和結果框的動態變化 data: { input: “”, // 輸入框內容 result: “” // 結果框內容 }, // 不需要調用PA的按鈕功能實現,此處列出退格鍵為例 deleteOne() { this.result = “”; this.input = this.input.substr(0, this.input.length-1);

}, // ... // 由等號觸發的方法,調用PA calculate() { // 新建CalculateService示例 var service = new CalculateService();

// 調用calculate方法,傳入輸入框內容并將返回結果賦值給結果框 service.calculate(this.input) .then((data) =》 { this.result = data[“abilityResult”];

}); }}

啟動手機模擬器,并運行程序,即可生成結果。效果展示如下:

至此,一個運用js2java-codegen工具開發的計算器Demo就完成了。該工具引入的代碼生成技術,大大提升了跨語言調用場景的開發效率,讓HarmonyOS開發者更能專注業務開發,提升開發體驗。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 操作系統
    +關注

    關注

    37

    文章

    6742

    瀏覽量

    123192
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2634

    瀏覽量

    66220
  • HarmonyOS
    +關注

    關注

    79

    文章

    1967

    瀏覽量

    30023

原文標題:無需手動撰寫,HarmonyOS工具自動生成代碼,真香!

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    探索設計稿自動生成Flutter代碼的技術方案

    作者:京東物流 冷先鋒 近年來,隨著人工智能和大模型技術的發展,設計稿(UI視圖)自動生成代碼的技術也在不斷進步。本文將探討幾家知名企業在這一領域的探索和實踐,包括美團、京東、微軟等,以及一些常見
    的頭像 發表于 11-08 10:09 ?817次閱讀
    探索設計稿<b class='flag-5'>自動</b><b class='flag-5'>生成</b>Flutter<b class='flag-5'>代碼</b>的技術方案

    如何自動生成verilog代碼

    介紹幾種自動生成verilog代碼的方法。
    的頭像 發表于 11-05 11:45 ?205次閱讀
    如何<b class='flag-5'>自動</b><b class='flag-5'>生成</b>verilog<b class='flag-5'>代碼</b>

    鴻蒙跨端實踐-JS虛擬機架構實現

    在Roma跨端方案中,JS虛擬機是框架的核心,負責執行動態化的JS代碼。在Android平臺采用了基于V8的J2V8,iOS平臺則使用了系統自帶的JSCore,而在HarmonyOS
    的頭像 發表于 09-30 14:42 ?2328次閱讀
    鴻蒙跨端實踐-<b class='flag-5'>JS</b>虛擬機架構實現

    java反編譯的代碼可以修改么

    的影響。 1. Java反編譯工具 在Java反編譯領域,有一些知名的工具可以幫助開發者將字節碼轉換回源代碼。這些工具包括: JD-GUI :一個圖形界面的反編譯工具,可以查看反編譯后的代碼
    的頭像 發表于 09-02 11:00 ?514次閱讀

    如果要測試pAfA級的電流信號,有沒有推薦的運放?

    如果要測試pAfA級的電流信號,有沒有推薦的運放?
    發表于 08-05 08:20

    HarmonyOS NEXT Developer Beta1最新術語表

    A abc文件 方舟字節碼(ArkCompiler Bytecode)文件,是ArkCompiler的編譯工具鏈以源代碼作為輸入編譯生成的產物,其文件后綴名為.abc。在發布態,abc文件會被打包到
    發表于 06-27 16:16

    ISEDA首發!大語言模型生成代碼到底好不好使

    在大模型席卷一切、賦能百業的浪潮里,“碼農”也沒能獨善其身。各種代碼自動生成的大模型,似乎描繪了一個人人都能像資深工程師一樣寫代碼的美好未來。 但在這個理想成為現實之前,有一個不能回避
    發表于 05-16 13:41 ?298次閱讀
    ISEDA首發!大語言模型<b class='flag-5'>生成</b>的<b class='flag-5'>代碼</b>到底好不好使

    使用MotorControl Workbench 5.4.6生成代碼時提示stm32cubemx v6.3安裝了不正確的java版本是怎么回事?

    在使用MotorControl Workbench 5.4.6生成代碼時提示stm32cubemx v6.3 安裝了不正確的java版本,please install JAVA JRE
    發表于 04-02 07:57

    鴻蒙OS應用開發:【DevEco Studio3.0 和 3.1版本差異】

    自動生成對應的代碼和資源模板。同時,DevEco Studio還提供了多種編程語言供開發者進行HarmonyOS應用/服務開發,包括
    的頭像 發表于 03-26 17:21 ?1065次閱讀
    鴻蒙OS應用開發:【DevEco Studio3.0 和 3.1版本差異】

    【鴻蒙】NAPI 框架生成工具實現流程

    NAPI 框架生成工具 可以根據用戶指定路徑下的 ts(typescript)接口文件一鍵生成 NAPI 框架代碼、業務代碼框架、GN 文件等。在開發
    的頭像 發表于 02-28 17:00 ?644次閱讀
    【鴻蒙】NAPI 框架<b class='flag-5'>生成</b>工具實現流程

    HarmonyOS開發技術全面分析

    HarmonyOS 通過組件化和小型化等設計方法,支持多種終端設備按需彈性部署,能夠適配不同類別的硬件資源和功能需求。支撐通過編譯鏈關系去自動生成組件化的依賴關系,形成組件樹依賴圖,支撐產品系統的便捷開發
    發表于 02-21 16:31

    鴻蒙開發第一課-各類名詞介紹以及基礎功能實現

    FA支持Page Ability,Page模板FA唯一支持的模板,用于提供與用戶交互的能力。一個Page實例可以包含一組相關頁面,每個頁面用一個AbilitySlice實例表示。
    的頭像 發表于 01-25 14:32 ?491次閱讀
    鴻蒙開發第一課-各類名詞介紹以及基礎功能實現

    單片機代碼自動生成器程序

    單片機代碼自動生成器是一種能夠幫助開發人員快速生成單片機代碼的工具。它利用了現代計算機技術和算法,能夠根據用戶提供的輸入和需求,
    的頭像 發表于 01-08 14:12 ?2911次閱讀

    能夠生成java文檔注釋的命令

    生成Java文檔注釋的命令是通過使用Java的自帶工具Javadoc來實現的。Javadoc是一個能夠從源代碼中提取注釋并生成文檔的工具。下
    的頭像 發表于 11-29 14:12 ?811次閱讀

    js文件可以直接瀏覽器運行嗎

    載和運行。 在Web開發中,JS常被用于實現動態交互效果和頁面邏輯控制。通過將JS代碼嵌入到網頁的HTML文件中,瀏覽器可以在頁面加載過程中自動執行
    的頭像 發表于 11-27 16:45 ?3888次閱讀