敞开成长之旅!这是我参与「日新方案 2 月更文应战」的第 6 天,点击检查活动概况

前语

事情是这样的,便是在和前端的哥对接的时分,便是Android和web的通讯,Android调用Web的一个办法,传了参数过去,json的字符串参数,然后老哥来找我说,我怎样把目标传给他,让我改成传字符串给他。

也便是这串代码

webView.loadUrl("javascript:" + function + "(" + params + ")");

我当时瞬间懵B了,跨端通讯能传个吉尔目标,我说是你那边转的吧,跨端通讯怎样可能传得了目标,跨端通讯都是传根底数据类型和字符串。可是他不信,矢口不移便是我传目标。没办法,总不能都干瞪眼吧,我便是具体检查怎样回事,其实这种只需有点常识的都知道是内部自己转,然后我找到如果想让内部不转的话,就这样写

webView.loadUrl("javascript:" + function + "('" + params + "')");

这件事之后,我觉得就很无法,由于这明明便是一个常识,他却不信,关键我还压服不了他,没有强有力的依据。

原来我也不懂跨端通讯

然后我就去思考,如何压服他。

首先,跨端通讯,必定传不了目标,这个是毋庸置疑的,目标只是你这个端定义的东西,并不是所有端都适用,更精确来说,应该是根底数据类型也不能直接传,内部是会做转化的。举个简略的比方,就拿NDK来说,虽然在调用时能传目标,可是native层接纳目标的结构体是jobject,是做了转化的。

那这个转化是怎样做的呢?这个转化的逻辑应该是不同的端要写不同的转化逻辑,我举一个不是很恰当的比方,拿Serializable来说,序列化之后,其实数据里面不光是数据信息,还包含类信息这些,然后是有必定的格式的。这边也相同,比方我在android端传个目标给其它端,其它端拿到子解码之后,依据这个格式拿到有用的数据,再其它端创立一个该端的目标结构,把数据填进去。

可是想着想着我又想到了一个点,那其它端是怎样调用java的办法的呢?想到这我忽然就感到很懵B了。

有的人就说了,前端调Android便是直接拦截或许addJavascriptInterface办法啊,这我不懂?就拿addJavascriptInterface来说,那它里面呢,它底层封装的呢?终究怎样在js中调用到java的?莫非你能在在js中写javaObject.function(xxx)?

包括做游戏的有用C#和java通讯,那是怎样实现的?其实这些问题都属于同一个问题,要想通这个问题,最好仍是拿C++和java的通讯来说,它们怎样通讯的,jni,那jni里面做了什么,具体的我也不清楚,但好像它有JVM的目标,所以我觉得这事和JVM有关。

但细心一想,好像确实是那么一回事,你想想,怎样调用java目标的办法的,javaObject.function(xxx),在java中是这样调用的,那javaObject这个目标存在哪里?存在堆中。堆在哪里?堆在虚拟机中。所以要拿到目标,只能经过JVM从它的堆中找,所以一切的跨端通讯应该都是要经过JVM ,而且JVM是底层的代码,所以这个过程是要经过底层。

那返回来想,前端是在怎样调用到的,我想,前端页面是运行在webview上,webview的内核是WebKit,WebKit是android体系有提供的Native C/C++ Libraries ,所以它是能调用到JVM的。所以我认为webview是经过WebKit,WebKit去调用JVM,拿到具体的目标,然后再调用具体的办法。反过来,java调用js的办法,应该靠的是解说器。

但我仍是不懂跨端通讯,由于我不懂JVM中具体的操作和其间一些具体流程,但我感觉大体的流程应该是这样的。

最后附送一下,如果在网上找不到你想要的答案怎样办

原来我也不懂跨端通信