跳到主要内容

替换系统能力

由于HarmonyOS系统使用的协议栈和其它系统不同,因此游戏原有的系统方法,例如获取剪切板、获取电量等在HarmonyOS平台可能不支持,您需根据当前游戏的实际使用情况进行替换适配。游戏业务逻辑调用HarmonyOS系统接口的原理如下图所示:

如图所示,当前HarmonyOS提供的系统接口主要包括如下两类:

此处主要介绍的是使用ArkTS接口时通过NAPI框架进行C#和JS跨语言调用。当前NAPI框架建议直接使用开源的AKI (Alpha Kernel Interacting)开发框架,该框架支持极简语法使用方式,一行代码即可完成JS与C#的无障碍跨语言互调。

C#调用JS

C#调用JS是团结引擎为调用HarmonyOS系统JS接口定制的一套规范,底层是调用HarmonyOS系统的NAPI接口。

在调用接口前,先在团结引擎中通过ts文件导出要使用的接口,即在Assets\Plugins\OpenHarmony目录下新建声明文件,声明文件中导出的函数名称格式为Register+声明文件名,例如声明文件名为OpenHarmonyClass.tslib,则导出的函数名称为RegisterOpenHarmonyClass()。示例代码如下:

import sensor from '@ohos.sensor';
import geoLocationManager from '@ohos.geoLocationManager';
export function RegisterOpenHarmonyClass()
{
let requestInfo: geoLocationManager.LocationRequest = {'priority': 0x203, 'scenario': 0x300, 'timeInterval': 0, 'distanceInterval': 0, 'maxAccuracy': 0};
const register = {};
register["sensor"] = sensor;
register["geolocation"] = geoLocationManager;
register["requestInfo"] = requestInfo;
return register;
}

申请系统权限

在DevEco Studio中,HarmonyOS游戏申请系统权限需做如下两件事:

  1. 在module.json5配置文件中添加权限声明。
  2. 若请求的是需要用户授权的权限,您需在JS代码中调用接口向用户请求授权。

同样的,在团结引擎的C#层面上申请系统权限也要经历这两件事:

  1. 在团结引擎中声明权限。在团结引擎的菜单栏选择“File > Building Setting > Player”,在“Other Settings > Predefined Permissions”下填写权限名称。

  2. 调用接口。在C#代码中调用OpenHarmonyPermissionAPI.RequestUserPermissions接口向用户请求权限。

    OpenHarmonyPermissionAPI.RequestUserPermissions(new []{"ohos.permission.APPROXIMATELY_LOCATION"}, 
    (s =>
    {
    Debug.Log("Granted");
    // 执行权限相关逻辑
    TestApi.ListenGeolocation();
    }),(s => Debug.Log("Denied LOCATION")));

调用有回调参数的接口

要调用如下接口,接口详细说明请参考@ohos.sensor

Sesor.once(type: SensorId.ACCELEROMETER, callback: Callback<AccelerometerResponse>): void

调用步骤如下:

  1. 获取声明的对象。

    var sensor = new OpenHarmonyJSObject("sensor");
  2. 定义回调参数。

    private static void SensorOnCallback(params OpenHarmonyJSObject[] args) 
    {
    var sensorData1 = args[0];
    Debug.Log("Sensor object in callback: " + sensorData1);
    Debug.Log("Sensor in callback: " + sensorData1.Get<float>("x") + "," + sensorData1.Get<float>("y") + "," + sensorData1.Get<float>("z"));
    SensorData = sensorData1;
    }
    var sensorOnCallback = new OpenHarmonyJSCallback(SensorOnCallback);
  3. 调用sensor方法。

    sensor.Call("once", 1, sensorOnCallback);

调用有对象参数的接口

例如调用如下接口,接口的详细说明请参考geoLocationManager.on('locationChange')

geoLocationManager.on(type: ‘locationChange’, request: LocationRequest, callback: Callback<Location>): void

这个接口需注意如下两点:

  • 接口有一个LocationRequest类型入参,这是ts中的Interface类型,需要在ts声明文件中提前注册好,由C#代码中通过OpenHarmonyJsObject获取。
  • 接口有回调入参,请参考申请系统权限

调用步骤如下:

  1. 获取ts文件中的声明对象。

    var geolocationManager = new OpenHarmonyJSObject("geolocation");
    var requestInfo = new OpenHarmonyJSObject("requestInfo");
  2. 定义回调参数。

    private static void GeolocationCallback(params OpenHarmonyJSObject[] args)
    {
    var geoLocationData = args[0];
    Debug.Log("latitude: " + geoLocationData.Get<float>("latitude"));
    Debug.Log("longitude: " + geoLocationData.Get<float>("longitude"));
    }
  3. 调用方法。

    var geolocationCallback = new OpenHarmonyJSCallback(GeolocationCallback);
    geolocationManager.Call("on", "locationChange", requestInfo, geolocationCallback);

JS调用C#

  1. 在团结引擎中写好需要调用的C#方法,当前仅支持字符串参数,例如示例中的Test()方法。

    public class JsCallCSharp : MonoBehaviour
    {
    public void Start()
    {
    OpenHarmonyJSClass JsClass = new OpenHarmonyJSClass("StaticClassTest");
    JsClass.CallStatic<int>("JsCallCSharpFunc");
    }
    public void Test(string param)
    {
    Debug.Log(param);
    }
    }
  2. 在DevEco Studio的JS代码中使用tuanjie.TuanjieSendMessage调用C#方法。

    import tuanjie from 'libtuanjie.so';
    ....
    static JsCallCSharpFunc()
    {
    tuanjie.TuanjieSendMessage("Main Camera", "Test", "Js Call CSharp Success");
    return 0;
    }