一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS如何自動(dòng)生成JS FA調(diào)用Java PA的模板代碼

HarmonyOS開(kāi)發(fā)者 ? 來(lái)源:HarmonyOS開(kāi)發(fā)者 ? 作者:guxinmeng ? 2021-09-28 10:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

本期,小編將通過(guò)開(kāi)發(fā)一個(gè)簡(jiǎn)單的計(jì)算器應(yīng)用,闡述JS UI框架下,如何使用js2java-codegen工具自動(dòng)生成JS FA調(diào)用Java PA的模板代碼。

注:以下內(nèi)容中涉及到的 “FA調(diào)用PA”,均是指JS UI框架下JS FA調(diào)用Java PA。

js2java-codegen是HarmonyOS SDK中Toolchains工具鏈從2.2.0.3版本開(kāi)始提供的自動(dòng)生成FA調(diào)用PA代碼的輔助開(kāi)發(fā)工具。它可以根據(jù)用戶源碼自動(dòng)生成FA調(diào)用PA時(shí)所需的Java和JS模板代碼,該模板代碼與用戶編寫的業(yè)務(wù)代碼相互分離,降低了代碼的耦合。

目前,js2java-codegen工具所支持的FA調(diào)用PA實(shí)現(xiàn)方式為InternalAbility類型,Ability類型尚不支持。

說(shuō)明 :當(dāng)前JS FA調(diào)用Java PA的機(jī)制中,提供了Ability和InternalAbility兩種調(diào)用方式:

Ability:擁有獨(dú)立的Ability生命周期,F(xiàn)A使用遠(yuǎn)端進(jìn)程通信拉起并請(qǐng)求PA服務(wù),適用于基本服務(wù)供多FA調(diào)用或者服務(wù)在后臺(tái)獨(dú)立運(yùn)行的場(chǎng)景。

InternalAbility:與FA共進(jìn)程,采用內(nèi)部函數(shù)調(diào)用的方式和FA進(jìn)行通信,適用于對(duì)服務(wù)響應(yīng)時(shí)延要求較高的場(chǎng)景。該方式下PA不支持其他FA訪問(wèn)調(diào)用。

更多JS FA調(diào)用Java PA的機(jī)制官網(wǎng)文檔

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

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

DevEco Studio官網(wǎng)下載鏈接:

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

1. 新建工程

在最新版的DevEco Studio 2.2 Beta2下,新建一個(gè)包含JS的手機(jī)項(xiàng)目。

2. 工具配置

開(kāi)發(fā)者需在進(jìn)行代碼生成模塊下的build.gradle中進(jìn)行編譯設(shè)置及開(kāi)關(guān)控制。編譯參數(shù)位于ohos -》 defaultConfig下,開(kāi)發(fā)者需用以下方式設(shè)置JS模板代碼生成路徑,即‘jsOutputDir’對(duì)應(yīng)的值。代碼如下:

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

工具開(kāi)關(guān)位于ohos下,值設(shè)為true則啟用工具,false或不進(jìn)行配置則不啟用工具。配置代碼如下:

ohos { compileOptions { // 此處為啟用js2java-codegen工具的開(kāi)關(guān)。值為true則啟用工具,false則不啟用工具。 f2pautogenEnabled true }}

3. PA側(cè)代碼編寫

開(kāi)發(fā)者需在PA側(cè)用Java語(yǔ)言手動(dòng)編寫實(shí)現(xiàn)計(jì)算器業(yè)務(wù)邏輯的InternalAbility類,用于接收FA側(cè)傳來(lái)的運(yùn)算表達(dá)式,并對(duì)表達(dá)式的合法性進(jìn)行檢驗(yàn)。然后通過(guò)單獨(dú)編寫一個(gè)工具類來(lái)完成對(duì)運(yùn)算表達(dá)式的計(jì)算,并由InternalAbility來(lái)調(diào)用,將計(jì)算結(jié)果返回FA側(cè)。本示例中,開(kāi)發(fā)者通過(guò)新建CalculateService類實(shí)現(xiàn)計(jì)算器的業(yè)務(wù)邏輯,并對(duì)CalculateService類本身添加@InternalAbility注解,表示該類為InternalAbility類,并且用參數(shù)指定該類注冊(cè)到同包中的MainAbility類。然后通過(guò)calculate()方法來(lái)實(shí)現(xiàn)計(jì)算器的基本操作,包括入?yún)z驗(yàn)、調(diào)用工具類實(shí)現(xiàn)運(yùn)算表達(dá)式的計(jì)算、捕獲異常并返回結(jié)果,部分示例代碼如下所示:

package com.example.simplecalculatorfapa;import

com.example.simplecalculatorfapa.utils.Util;import

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

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

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

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

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

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

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

工具注解說(shuō)明:js2java-codegen工具通過(guò)注解來(lái)獲取信息并生成開(kāi)發(fā)者所需的代碼。因此用戶如果想使用該工具輔助開(kāi)發(fā),則需要了解以下三種注解的用法:@InternalAbility注解:類注解,用于被使用作InternalAbility的、包含實(shí)際業(yè)務(wù)代碼的類(簡(jiǎn)稱InternalAbility類)。包含一個(gè)參數(shù):registerTo,參數(shù)值為需要注冊(cè)的Ability類全名。

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

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

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

@ContextInject AbilityContext abilityContext;

4. 編譯

編寫完InternalAbility類的業(yè)務(wù)代碼后,下面FA調(diào)用PA的模板代碼生成工作就交給js2java-codegen工具吧!

開(kāi)發(fā)者只需點(diǎn)擊菜單欄中的Build -》 Build HAP(s)/APP(s) -》 Build HAP(s),即可完成對(duì)項(xiàng)目的編譯,同時(shí)js2java-codegen工具會(huì)在編譯過(guò)程中完成FA調(diào)用PA通道代碼的生成。 編譯過(guò)程會(huì)生成Java和JS的模板代碼。

① 自動(dòng)生成的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;}

② 自動(dòng)生成的JS模板代碼位于開(kāi)發(fā)者在編譯設(shè)置中設(shè)置的路徑,名稱與InternalAbility類的名稱相對(duì)應(yīng)。自動(dòng)生成的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側(cè)代碼編寫

FA側(cè)的內(nèi)容包含“由html與css代碼編寫的靜態(tài)頁(yè)面”及“實(shí)現(xiàn)按鈕與方法動(dòng)態(tài)關(guān)聯(lián)的JS代碼”。首先,開(kāi)發(fā)者需在開(kāi)頭引入由js2java-codegen工具自動(dòng)生成的JS模板代碼的FA接口類,然后實(shí)現(xiàn)計(jì)算器按鈕對(duì)應(yīng)的方法。由于“=”按鈕對(duì)應(yīng)的方法調(diào)用了PA側(cè)的計(jì)算功能,因此需在該方法中新建FA接口示例,并調(diào)用對(duì)應(yīng)方法(名稱與InternalAbility類中需要被調(diào)用的方法名稱相同),并將輸入框的值傳入,將返回值打印在結(jié)果框中。

本示例中,開(kāi)發(fā)者通過(guò)在開(kāi)頭引入由js2java-codegen工具自動(dòng)生成的JS模板代碼的CalculateService接口類(from后的值需要與編譯設(shè)置中的路徑進(jìn)行統(tǒng)一,JS模板代碼文件名稱與InternalAbility類名相同),然后用data實(shí)現(xiàn)輸入框與結(jié)果框的動(dòng)態(tài),并在等號(hào)按鈕對(duì)應(yīng)的calculate()方法中新建接口實(shí)例,通過(guò)調(diào)用接口類的calculate()方法,將輸入框值傳入,并把返回值賦給結(jié)果框。示例代碼如下所示:

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

export default { // 用于實(shí)現(xiàn)輸入框和結(jié)果框的動(dòng)態(tài)變化 data: { input: “”, // 輸入框內(nèi)容 result: “” // 結(jié)果框內(nèi)容 }, // 不需要調(diào)用PA的按鈕功能實(shí)現(xiàn),此處列出退格鍵為例 deleteOne() { this.result = “”; this.input = this.input.substr(0, this.input.length-1);

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

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

}); }}

啟動(dòng)手機(jī)模擬器,并運(yùn)行程序,即可生成結(jié)果。效果展示如下:

至此,一個(gè)運(yùn)用js2java-codegen工具開(kāi)發(fā)的計(jì)算器Demo就完成了。該工具引入的代碼生成技術(shù),大大提升了跨語(yǔ)言調(diào)用場(chǎng)景的開(kāi)發(fā)效率,讓HarmonyOS開(kāi)發(fā)者更能專注業(yè)務(wù)開(kāi)發(fā),提升開(kāi)發(fā)體驗(yàn)。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7152

    瀏覽量

    125582
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2642

    瀏覽量

    68099
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2126

    瀏覽量

    33059

原文標(biāo)題:無(wú)需手動(dòng)撰寫,HarmonyOS工具自動(dòng)生成代碼,真香!

文章出處:【微信號(hào):HarmonyOS_Dev,微信公眾號(hào):HarmonyOS開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    HarmonyOS AI輔助編程工具(CodeGenie)代碼測(cè)試

    代碼、生命周期函數(shù)、@Extend/@Styles/@Builder修飾的函數(shù)、private修飾的私有函數(shù)不支持生成單元測(cè)試用例。 使用該功能需先完成CodeGenie登錄授權(quán)。 以上材料主要參考引用HarmonyOS官方文檔
    發(fā)表于 07-14 17:33

    HarmonyOS AI輔助編程工具(CodeGenie)UI生成

    UI Generator基于BitFun Platform AI能力平臺(tái),用于快速生成可編譯、可運(yùn)行的HarmonyOS UI工程,支持基于已有UI布局文件(XML),快速生成
    發(fā)表于 07-10 11:51

    鴻蒙中Stage模型與FA模型詳解

    HarmonyOS 5】鴻蒙中Stage模型與FA模型詳解 ##鴻蒙開(kāi)發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財(cái)# 一、前言 在HarmonyOS
    的頭像 發(fā)表于 07-07 11:50 ?174次閱讀

    FA模型切換到Stage模型時(shí):module的切換說(shuō)明

    form_config.json。 srcLanguageAbility開(kāi)發(fā)語(yǔ)言的類型。/Stage模型不支持。 srcPath該標(biāo)簽標(biāo)識(shí)Ability對(duì)應(yīng)的JS組件代碼路徑。srcEntry該標(biāo)簽標(biāo)識(shí)
    發(fā)表于 06-05 08:16

    FA模型的ServiceAbility的切換介紹

    。 將FA應(yīng)用中ServiceAbility的業(yè)務(wù)代碼遷移到新創(chuàng)建的ServiceExtensionAbility中。ServiceAbility和ServiceExtensionAbility
    發(fā)表于 06-05 07:24

    HarmonyOS5云服務(wù)技術(shù)分享--Serverless抽獎(jiǎng)模板部署

    函數(shù)列表 找到自動(dòng)生成的draw-raffle和get-campaign-by-id函數(shù) 修改工程包里的function.js文件同步函數(shù)名 三、托管上線關(guān)鍵點(diǎn) 1?? ??文件打包大坑?? 進(jìn)入
    發(fā)表于 05-22 20:25

    HarmonyOS5云服務(wù)技術(shù)分享--ArkTS調(diào)用函數(shù)

    小白也能輕松上手?。ㄎ哪┯型暾?b class='flag-5'>代碼模板哦) ? 前期準(zhǔn)備 1?? 登錄華為AppGallery Connect控制臺(tái) 2?? 確保已創(chuàng)建好云函數(shù)項(xiàng)目(還沒(méi)有的話快去后臺(tái)創(chuàng)建一個(gè)吧) ? 核心四步走
    發(fā)表于 05-22 18:22

    HarmonyOS5云服務(wù)技術(shù)分享--ArkTS開(kāi)發(fā)Node環(huán)境

    、支付平臺(tái)的通知,觸發(fā)自動(dòng)化流程。 ? 四、總結(jié)與展望 通過(guò)本文,你已經(jīng)掌握了HarmonyOS云函數(shù)的核心開(kāi)發(fā)流程,特別是Node.js與HTTP觸發(fā)器的實(shí)戰(zhàn)技巧。隨著HarmonyOS
    發(fā)表于 05-22 17:21

    HarmonyOS5云服務(wù)技術(shù)分享--云函數(shù)創(chuàng)建配置指南

    。HarmonyOS的AGC平臺(tái)提供靈活配置,支持Node.js、Python、Java等多種語(yǔ)言,還能自定義運(yùn)行環(huán)境哦! ?? 二、手把手創(chuàng)建第一個(gè)云函數(shù) ??Step 1:進(jìn)入云函數(shù)控制臺(tái)?? 登錄
    發(fā)表于 05-22 17:08

    AKI跨語(yǔ)言調(diào)用庫(kù)神助攻C/C++代碼遷移至HarmonyOS NEXT

    /C++代碼快速遷移至HarmonyOS NEXT。憑借卓越的兼容性,AKI已成為廠商與開(kāi)發(fā)者打造鴻蒙原生應(yīng)用過(guò)程中廣泛使用的跨語(yǔ)言調(diào)用解決方案。 AKI是一款專為鴻蒙原生開(kāi)發(fā)設(shè)計(jì)的FFI(外部函數(shù)接口
    發(fā)表于 01-02 17:08

    探索設(shè)計(jì)稿自動(dòng)生成Flutter代碼的技術(shù)方案

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

    如何自動(dòng)生成verilog代碼

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

    鴻蒙跨端實(shí)踐-JS虛擬機(jī)架構(gòu)實(shí)現(xiàn)

    在Roma跨端方案中,JS虛擬機(jī)是框架的核心,負(fù)責(zé)執(zhí)行動(dòng)態(tài)化的JS代碼。在Android平臺(tái)采用了基于V8的J2V8,iOS平臺(tái)則使用了系統(tǒng)自帶的JSCore,而在HarmonyOS
    的頭像 發(fā)表于 09-30 14:42 ?3004次閱讀
    鴻蒙跨端實(shí)踐-<b class='flag-5'>JS</b>虛擬機(jī)架構(gòu)實(shí)現(xiàn)

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

    的影響。 1. Java反編譯工具 在Java反編譯領(lǐng)域,有一些知名的工具可以幫助開(kāi)發(fā)者將字節(jié)碼轉(zhuǎn)換回源代碼。這些工具包括: JD-GUI :一個(gè)圖形界面的反編譯工具,可以查看反編譯后的代碼
    的頭像 發(fā)表于 09-02 11:00 ?1278次閱讀

    如果要測(cè)試pA、fA級(jí)的電流信號(hào),有沒(méi)有推薦的運(yùn)放?

    如果要測(cè)試pAfA級(jí)的電流信號(hào),有沒(méi)有推薦的運(yùn)放?
    發(fā)表于 08-05 08:20