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

如图所示,当前HarmonyOS提供的系统接口主要包括如下两类:
- Native接口:游戏可以使用C#直接调用接口。
- ArkTS接口:游戏需通过Node-API框架进行C#和JS的相互调用。
此处主要介绍的是使用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游戏申请系统权限需做如下两件事:
- 在module.json5配置文件中添加权限声明。
- 若请求的是需要用户授权的权限,您需在JS代码中调用接口向用户请求授权。
同样的,在团结引擎的C#层面上申请系统权限也要经历这两件事:
-
在团结引擎中声明权限。在团结引擎的菜单栏选择“File > Building Setting > Player”,在“Other Settings > Predefined Permissions”下填写权限名称。

-
调用接口。在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
调用步骤如下:
-
获取声明的对象。
var sensor = new OpenHarmonyJSObject("sensor"); -
定义回调参数。
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); -
调用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获取。
- 接口有回调入参,请参考申请系统权限。
调用步骤如下:
-
获取ts文件中的声明对象。
var geolocationManager = new OpenHarmonyJSObject("geolocation");
var requestInfo = new OpenHarmonyJSObject("requestInfo"); -
定义回调参数。
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"));
} -
调用方法。
var geolocationCallback = new OpenHarmonyJSCallback(GeolocationCallback);
geolocationManager.Call("on", "locationChange", requestInfo, geolocationCallback);
JS调用C#
-
在团结引擎中写好需要调用的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);
}
} -
在DevEco Studio的JS代码中使用tuanjie.TuanjieSendMessage调用C#方法。
import tuanjie from 'libtuanjie.so';
....
static JsCallCSharpFunc()
{
tuanjie.TuanjieSendMessage("Main Camera", "Test", "Js Call CSharp Success");
return 0;
}