7 Star 30 Fork 8

Gitee Community / OpenHarmony组件开发大赛-有奖征文

 / 详情

HarmonyOS中JS与Java进行交互

意向
需求
创建于  
2021-10-09 15:57

为什么需要JS与Java进行交互
对于为什么有这个需求,我个人的理解是:对于大量的业务逻辑的处理,现有文档的JS能力不足以实现处复杂的业务逻辑,而Java却可以实现。由此展开以下知识点理解。
JS与Java交互的场景
JS里面需要处理复杂的业务逻辑,例如吃饭、是一个什么样的人什么时间,去看电影,看的什么电影,几点开始,电影内容是什么。这样的。再例如数据库操作,增删改查,几种数据库的组合使用,再例如需要人脸识别,需要只能AI,这些都是JS所不能够实现的。那又会有人讲我直接使用xml来实现不就行了,直接抛弃Java,但是xml再厉害也没有JS绘制页面那么圆滑,毕竟别人就是为画面而生的。闲话暂时先聊到这里。
JS与Java交互的原理
首先是ACE给了你这个交互的可能性,你才能够去交互。目前ACE还是支持js和Java这两种语言,各有有点,结合使用简直完美。对于各自的有点官网有,就不一一复读了。下面就说一说FA和PA,很显然既然是JS与Java的交互,那FA肯定使用JS来进行实现,那PA很自然的就落到了Java身上。JS的框架层提供了平台的扩展API的能力,能够让开发这轻松的调用API实现JS到JAVA端的调用,以及处理数据和订阅事件上报。通过JsBridge桥接起C++与JS,JsBridge主要负责加载JS代码,运行在QJS Engine上。将JS的消息往平台层透传,将JS数据转换成C++类型的数据,再通过C++与JAVA的JNI接口类,将C++的数据传递到JAVA侧,并接收JAVA侧返回的数据。就这交互完成了。
具体是如何实现的呢
来做个加法,一起体验一下JSCALLJAVA的美妙之处,那就计算世界最难的数学问题1+1=2吧。先从FA端,把该定义的定义了
var actionData = {};
actionData.firstNum = 1;
actionData.secondNum = 1;
var action = {};
action.bundleName = '包名';
action.abilityName = 'Java侧Ability名(带上包名全称)';
action.messageCode = ;
action.data = actionData;
//用什么样的ability方式你自己选
action.abilityType = ABILITY_TYPE_EXTERNAL;
action.syncOption = ACTION_SYNC;
FA端完成了可以开始PA端了:
你不得先来创建一个连接
private MyRemote remote = new MyRemote();
@加贝
protected IRemoteObject onConnect(Intent intent) {
super.onConnect(intent);
return remote.asObject();
}
创建完了,你不得把FA里面设置的包和Ability给分享过来吗,不然JAVA怎么知道你是谁。
private static final String BUNDLE_NAME = "包名";
private static final String ABILITY_NAME = "Ability名";
private static final int SUCCESS = 0;
private static final int ERROR = 1;
private static final int PLUS = 来个唯一标识;
/** * Internal ability 注册接口。 /
public static void register(AbilityContext abilityContext) {
instance = new ComputeInternalAbility();
instance.onRegister(abilityContext);
}
private void onRegister(AbilityContext abilityContext) {
this.abilityContext = abilityContext;
this.setInternalAbilityHandler((code, data, reply, option) -> {
return this.onRemoteRequest(code, data, reply, option);
});
}
什么时候用就什么时候拿,这样来注册和注销肯定会节省很多的资源。
/
* * Internal ability 注销接口。 */
public static void unregister() {
instance.onUnregister();
}
private void onUnregister() {
abilityContext = null;
this.setInternalAbilityHandler(null);
}
}
在你不注意的时候我已经讲值绑定好了,下面JS要CALLJava了,计算世界上最难的难题。
// FA调用PA
var result = await FeatureAbility.callAbility(action);
var ret = JSON.parse(result);
if (ret.code == 0) {
console.info('世界上最难难题答案:' + JSON.stringify(ret.abilityResult));
} else {
console.error('Java难道不会算吗:' + JSON.stringify(ret.code));
}
Java接到了JS的难题请求,开始计算,你传过来一套不是人看的东西,需要先解析解析。
// 消息参数解析
String dataStr = data.readString();
RequestParam param = new RequestParam();
try {
param = ZSONObject.stringToClass(dataStr, RequestParam.class);
} catch (RuntimeException e) {
HiLog.error(LABEL, "convert failed.");
}
// 这个计算完成了
Map<String, Object> result = new HashMap<String, Object>();
result.put("code", SUCCESS);
result.put("TheMostDifficultMath", param.getFirstNum() + param.getSecondNum());
// 给你JS,随你怎么整,反正我会。
reply.writeString(ZSONObject.toZSONString(result));
break;
}
到此JS与Java的交互就完成了。

评论 (0)

渊墨 创建了需求
渊墨 修改了描述
渊墨 修改了描述
渊墨 修改了描述
展开全部操作日志

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(1)
其他
1
https://gitee.com/gitee-community/OHZW210809.git
git@gitee.com:gitee-community/OHZW210809.git
gitee-community
OHZW210809
OpenHarmony组件开发大赛-有奖征文

搜索帮助