HarmonyOS 鸿蒙Next Js 调用 Java ,AceInternalAbility类

HarmonyOS 鸿蒙Next Js 调用 Java ,AceInternalAbility类

config.json
```json
{
  "app": {
    "bundleName": "work.yjzll.seesat10",
    "vendor": "yjzll",
    "version": {
      "code": 1000000,
      "name": "1.0.0"
    }
  },
  "deviceConfig": {},
  "module": {
    "package": "work.yjzll.seesat10",
    "name": ".MyApplication",
    "mainAbility": "work.yjzll.seesat10.MainAbility",
    "deviceType": [
      "phone"
    ],
    "distro": {
      "deliveryWithInstall": true,
      "moduleName": "entry",
      "moduleType": "entry",
      "installationFree": false
    },
    "abilities": [
      {
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ],
        "visible": true,
        "name": "work.yjzll.seesat10.MainAbility",
        "icon": "$media:icon",
        "description": "$string:mainability_description",
        "label": "$string:entry_MainAbility",
        "type": "page",
        "launchType": "standard"
      }
    ],
    "js": [
      {
        "pages": [
          "pages/index/index",
          "pages/JsAceInternalAbility/JsAceInternalAbility"
        ],
        "name": "default",
        "window": {
          "designWidth": 720,
          "autoDesignWidth": true
        }
      }
    ]
  }
}
JsAceInternalAbility.js
```javascript
import router from '@system.router';
import prompt from '@system.prompt';

const ABILITY_TYPE_EXTERNAL = 0;
const ABILITY_TYPE_INTERNAL = 1; // 选用0
const ACTION_SYNC = 0;
const ACTION_ASYNC = 1;

const ACTION_GET = 1001;
const SUBSCRIBE_EVENT = 1002;
const UNSUBSCRIBE_EVENT = 1003;

var mylongitude = 123.4;
var mylatitude = 11.1;

export default {
  data: {
    title: 'World',
    userdata02: "",
  },
  onInit(){},
  toindexback(){
    router.back();
  },
  onKey(keyevent){
    if (keyevent.code == 20){
      // 遥控器按下键=20,动作
    }
  },
  getAction: async function (){
    console.info('03B00 回调前,经纬度:' + mylongitude+"   "+mylatitude);
    var actionData = {};
    actionData.firstNum = mylongitude; //顺序一致! 格式相对应!
    actionData.secondNum = mylatitude; //顺序一致! 格式相对应!
    var action = {};
    action.bundleName = 'work.yjzll.seesat10';
    action.abilityName = 'JsCallJavaAceInternalAbility';
    action.messageCode = ACTION_GET; // 需要PA端约定一致
    action.data = actionData; //发送到 Ability 的数据,数据字段名称需要PA端约定。只有 FeatureAbility.callAbility 接口有
    action.abilityType = ABILITY_TYPE_INTERNAL; // 0:Ability調用方式  // 1:Internal Ability調用方式
    action.syncOption = ACTION_ASYNC; // 0:同步方式,默认方式 // 1:异步方式
    var result = await FeatureAbility.callAbility(action);
    var ret = JSON.parse(result);
    if (ret.code == 0) {
      mylongitude = JSON.stringify(ret.abilityResult1); //名称和数据类型,要与myLocationAbility.java中的一致
      mylatitude = JSON.stringify(ret.abilityResult2); //名称和数据类型,要与myLocationAbility.java中的一致
      console.info('03B00 回调结果,经纬度:' + mylongitude+"   "+mylatitude);
    } else {
      console.error('03B00 回调结果,错误码:' + JSON.stringify(ret.code));
    }
  },
  initAction: function (code) {
    var actionData = {};
    var action = {};
    action.bundleName = 'work.yjzll.seesat10';
    action.abilityName = 'JsCallJavaAceInternalAbility';
    action.messageCode = code;
    action.data = actionData;
    action.abilityType = ABILITY_TYPE_INTERNAL; // 0:Ability調用方式  // 1:Internal Ability調用方式
    action.syncOption = ACTION_ASYNC; // 0:同步方式,默认方式 // 1:异步方式
    return action;
  },
  mySubscribe: async function () {
    try {
      var action = this.initAction(SUBSCRIBE_EVENT);
      var that = this;
      var result = await FeatureAbility.subscribeAbilityEvent(action,function (resultFunc) {
        var resultData = JSON.parse(resultFunc).data;
        console.info("03B00 2 返回第一个参数: " + resultData.msg1);
        console.info("03B00 3 返回第二个参数: " + resultData.msg2);
      });
      console.info("03B00 订阅公共事件 结果 = " + result);
    } catch (pluginError) {
      console.error("03B00 订阅公共事件 错误 ,结果 = " + result + JSON.stringify(pluginError));
    }
  },
  myUnSubscribe: async function () {
    try {
      var action = this.initAction(UNSUBSCRIBE_EVENT);
      var result = await FeatureAbility.unsubscribeAbilityEvent(action);
      FeatureAbility.callAbility(action);
      console.info("03B00 退订公共事件 : " + result);
    } catch (pluginError) {
      console.error("03B00 退订公共事件错误 : " + JSON.stringify(pluginError));
    }
  },
  showToast:function(msg){
    prompt.showToast({
      message: msg,
      duration: 1000,
    });
  }
}
JsCallJavaAceInternalAbility.java
```java
package work.yjzll.seesat10;

import ohos.ace.ability.AceInternalAbility;
import ohos.event.commonevent.*;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.rpc.IRemoteObject;
import ohos.rpc.MessageOption;
import ohos.rpc.MessageParcel;
import ohos.rpc.RemoteException;
import ohos.utils.zson.ZSONObject;
import java.util.HashMap;
import java.util.Map;

public class JsCallJavaAceInternalAbility extends AceInternalAbility {

  private static final int ACTION_GET = 1001; // JS端发送的业务请求编码,与本PA端的定义保持一致
  private static final int SUBSCRIBE_EVENT = 1002;
  private static final int UNSUBSCRIBE_EVENT = 1003;
  private static final int SUCCESS = 0;
  private static final int ERROR = 1;
  private static final int DEFAULT_TYPE = 0;
  private static final String BUNDLE_NAME = "work.yjzll.seesat10";
  private static final String ABILITY_NAME = "JsCallJavaAceInternalAbility";
  private static JsCallJavaAceInternalAbility instance;
  private CommonEventSubscriber subscriber;
  private static final String TAG = JsCallJavaAceInternalAbility.class.getSimpleName();

  private static final HiLogLabel LABEL_LOG =
      new HiLogLabel(HiLog.LOG_APP, 0xD003B00, TAG);

  double num1, num2;

  private JsCallJavaAceInternalAbility() {
    super(BUNDLE_NAME, ABILITY_NAME);
  }

  public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
    switch (code) {
      case ACTION_GET: {
        String dataStr = data.readString();
        RequestParamEvent param;
        try {
          param = ZSONObject.stringToClass(dataStr, RequestParamEvent.class);
          num1 = param.getFirstNum() + 10;
          num2 = param.getSecondNum() + 10;
          HiLog.info(LABEL_LOG, "加10返回结果,第一个数:" + num1 + " 第二个数:" + num2);
        } catch (RuntimeException e) {
          HiLog.info(LABEL_LOG, "传入失败");
        }
        Map<String, Object> result = new HashMap<>();
        result.put("code", SUCCESS);
        result.put("abilityResult1", num1);
        result.put("abilityResult2", num2);
        if (option.getFlags() == MessageOption.TF_SYNC) {
          reply.writeString(ZSONObject.toZSONString(result));
        } else {
          MessageParcel responseData = MessageParcel.obtain();
          responseData.writeString(ZSONObject.toZSONString(result));
          IRemoteObject remoteReply = reply.readRemoteObject();
          try {
            remoteReply.sendRequest(SUCCESS, responseData, MessageParcel.obtain(), new MessageOption());
          } catch (RemoteException exception) {
            return false;
          } finally {
            responseData.reclaim();
          }
        }
        break;
      }
      case SUBSCRIBE_EVENT: {
        subscribeEvent(data, reply, option);
        break;
      }
      case UNSUBSCRIBE_EVENT: {
        unSubscribeEvent(reply);
        break;
      }
      default: {
        Map<String, Object> result = new HashMap<>();
        result.put("FA调用PA错误", ERROR);
        reply.writeString(ZSONObject.toZSONString(result));
        return false;
      }
    }
    return true;
  }

  private void subscribeEvent(MessageParcel data, MessageParcel reply, MessageOption option) {
    MatchingSkills matchingSkills = new MatchingSkills();
    matchingSkills.addEvent(CommonEventSupport.COMMON_EVENT_BATTERY_CHANGED);
    IRemoteObject notifier = data.readRemoteObject();
    CommonEventSubscribeInfo subscribeInfo = new CommonEventSubscribeInfo(matchingSkills);
    subscriber = new CommonEventSubscriber(subscribeInfo) {
      [@Override](/user/Override)
      public void onReceiveEvent(CommonEventData commonEventData) {
        replyMsg(notifier);
      }
    };
    if (option.getFlags() == MessageOption.TF_SYNC) {
      reply.writeString("订阅公共事件成功--同步");
    }
    try {
      CommonEventManager.subscribeCommonEvent(subscriber);
      reply.writeString(" 订阅公共事件成功--异步");
    } catch (RemoteException e) {
      HiLog.info(LABEL_LOG, "订阅公共事件--异步--意外抛出 RemoteException");
    }
  }

  private void replyMsg(IRemoteObject notifier) {
    MessageParcel notifyData = MessageParcel.obtain();
    String stringBuilder = "{\"" +
        "msg1\":\"" + num1 + "\",\"" +
        "msg2\":\"" + num2 + "\"}";
    notifyData.writeString(stringBuilder);
    try {
      notifier.sendRequest(DEFAULT_TYPE, notifyData, MessageParcel.obtain(), new MessageOption());
    } catch (RemoteException exception) {
      HiLog.info(LABEL_LOG, "replyMsg 抛出异常");
    } finally {
      notifyData.reclaim();
    }
  }

  private void unSubscribeEvent(MessageParcel reply) {
    try {
      CommonEventManager.unsubscribeCommonEvent(subscriber);
      reply.writeString("退订公共事件成功");
    } catch (RemoteException | IllegalArgumentException exception) {
      reply.writeString("退订公共事件失败");
    }
    subscriber = null;
  }

  public static JsCallJavaAceInternalAbility getInstance() {
    if (instance == null) {
      synchronized (JsCallJavaAceInternalAbility.class) {
        if (instance == null) {
          instance = new JsCallJavaAceInternalAbility();
        }
      }
    }
    return instance;
  }

  public void register() {
    this.setInternalAbilityHandler(this::onRemoteRequest);
  }

  public void deregister() {
    this.setInternalAbilityHandler(null);
  }
}
RequestParamEvent.java
```java
package work.yjzll.seesat10;

public class RequestParamEvent {

  private double firstNum;
  private double secondNum;

  public double getFirstNum() {
    return firstNum;
  }

  public void setFirstNum(double firstNum) {
    this.firstNum = firstNum;
  }

  public double getSecondNum() {
    return secondNum;
  }

  public void setSecondNum(double secondNum) {
    this.secondNum = secondNum;
  }
}
MainAbility.java
```java
package work.yjzll.seesat10;

import ohos.ace.ability.AceAbility;
import ohos.aafwk.content.Intent;

public class MainAbility extends AceAbility {

  [@Override](/user/Override)
  public void onStart(Intent intent) {
    JsCallJavaAceInternalAbility.getInstance().register();
    super.onStart(intent);
  }

  [@Override](/user/Override)
  public void onStop() {
    super.onStop();
    JsCallJavaAceInternalAbility.getInstance().deregister();
  }
}

更多关于HarmonyOS 鸿蒙Next Js 调用 Java ,AceInternalAbility类的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

给楼主点赞

更多关于HarmonyOS 鸿蒙Next Js 调用 Java ,AceInternalAbility类的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,Next.js(一个基于React的JavaScript框架)通常用于前端开发,而Java主要用于后端或服务层开发。在鸿蒙系统中直接通过Next.js调用Java代码并不常见,因为这两者是不同技术栈中的组件,分别运行在前端和后端。

特别是提到的AceInternalAbility类,这似乎是鸿蒙系统中一个特定于后端的组件或API,通常不会直接从前端JavaScript框架中调用。前端与后端的交互一般通过HTTP请求、WebSocket或其他网络通信技术实现。

如果你需要在鸿蒙应用的前端(Next.js)与后端(Java)之间进行交互,建议的做法是:

  1. 在Java后端设置一个API接口,用于处理来自前端的请求。
  2. 在Next.js前端通过fetch或axios等库发送HTTP请求到Java后端。
  3. Java后端处理请求并返回响应,前端接收并处理响应。

确保前后端之间的通信遵循RESTful原则或GraphQL等规范,以保持接口的清晰和易于维护。

如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html

回到顶部