1.介绍
业务需求需要提供较多native接口(Android、IOS)给Unity、Unreal来进行使用。为了方便开发,提供类似于阉割版的JSBridge的框架来实现通信。
native需要给engine提供大量接口,即主要讨论Engine如果调用Native接口为主。
2.原理
Unity调用Android、IOS接口。Unity提供AndroidJavaClass工具类来进行通信,IOS则是直接通过C#调用C++方法。
//Android
var javaClass = new AndroidJavaClass("className");
javaClass.CallStatic("methodName", "params");
//IOS
[DllImport("__Internal")]
private static extern void ObjCMethod();
CSharpObj.ObjCMethod();
Unreal4调用Android、IOS接口。Unreal也类似,提供FAndroidApplication来进行JNI调用,IOS则是可以直接通过Objc和C++相互调用进行实现。
//Android
JNIEnv *env = FAndroidApplication::GetJavaEnv();
auto jUnrealClass = FAndroidApplication::FindJavaClass(ClassName);
env->CallStaticObjectMethod();
//IOS 省略
3.调用流程
除了业务需求外,需要保证以下几点的实现,Unity、Unreal、Android、IOS的兼容,接入,方法调用以及回调。
3.1 方法调用
框架的核心点就在于Engine如何调用到native的方法。要保证各个平台的兼容性,就得自定义一套通信协议。这里使用Json来当做消息通信的载体。
{
"service":"className",
"method":"methodName",
"callback":true,
"callbackId":"callbackId",
"args":"{
"args1":"value1",
"args:2":"value2"
}"
}
Engine通过发送以上消息体(Command)给native层。
service:类名称
method:方法名称
callback:是否需要回调
callbackId:回调UUID,用于区分回调
args:参数
3.2 方法回调
我们可以通过Command来进行发送消息,要支持回调,也就需要订一个Result来接受Native的信息。
{
"code":0,
"message":"Success",
"callbackId":"callbackId",
"content":"{
"result1":"value1",
"result2":"value2"
}"
}
Engine通过以上消息题来接受Native的消息。
code:0 是否调用成功
message