React Native Android 通信原理

  在遍历RemoteModules的时候需要为每一个映射对象生成Java暴漏的方法,因为JS是不支持消息转发,如果调用了没有实现的方法,那么就直接生成一个错误,所以要知道每一个暴漏的Module要暴漏的方法,在JS端预先生成对应的实现。在Java端初始化的时候已经在JS中注入了config信息,包括了要暴漏的类和方法名,足已生成镜像对象了。MessageQueue.js中的_genMethod方法中为每一个映射对象生成相应的方法实现。最后生成方法如下:

  > NativeModules.ExportModule.hello

  < function () {

  for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {

  args[_key2] = arguments[_key2];

  }

  var lastArg = args.length > 0 ? args[args.length - 1] : null;

  var secondLastArg = args.length > 1 ? args[args.length - 2] : null;

  var hasSuccCB = typeof lastArg === 'function';

  var hasErrorCB = typeof secondLastArg === 'function';

  hasErrorCB && invariant(hasSuccCB, 'Cannot have a non-function arg after a function arg.');

  var numCBs = hasSuccCB + hasErrorCB;

  var alt="" width="550" height="432" />

  在JSCExecutor的构造方法中调用了 installGlobalFunction(m_context, "nativeFlushQueueImmediate", nativeFlushQueueImmediate); ,这样就在JS环境中注册了nativeFlushQueueImmediate方法,当在JS中调用了nativeFlushQueueImmediate就会执行JSCExecutor的nativeFlushQueueImmediate C++方法,然后调用 executor->flushQueueImmediate(resStr); ,如上图所示,会回调到 OnLoad.cpp中的dispatchCallbacksToJava()方法,上图中红框中是采用了C++的闭包写法, 参考

  dispatchCallbacksToJava ---> makeJavaCall() ---> env->CallVoidMethod()

  最后调用到CallVoidMethod的jni方法,这样就从C++调用到了Java代码了,传入的CallVoidMethod的callback参数就是在创建ReactBrdige的时候传入的NativeModuleReactCallback的java对象对应的jni对象,而gCallbackMethod就是call方法,这样就调用到了Java类NativeModuleReactCallback的call方法。哇哦~终于回到java了~,Java在通过反射最后调用实际的java方法。

 https://longv2go.github.io/2016/02/02/react-android-通信原理.html