一、引言
最近,老大给了我一个学习研讨任务,也就是如何让 js 和 C++ 进行互调使用。比如我可以在网页中,使用 js 代码调用 c++ 函数,也可以在 c++ 函数中调用 js 对于界面进行控制。
这是为后期的软件接入 Html5 做技术调研。
那么如何实现呢?
这里需要感谢 Redrain 的博客给Webkit内核的浏览器控件增加互交功能,通过参考他的博客,加之我自己的探索,一步一坑终于完成了这个 demo。
如果想要直接看大神的博客可以点击上面那个链接,如果你是个跟我一样在之间一无所知的小白,那就可以看看我作为小白的一步一步的探索吧,应该会比上面大神的博客详细一些。
二、基于 SOUI 的浏览器控件
我这个浏览器 demo 是基于 SOUI 界面库,而 Redrain 的 demo 是基于 duilib 的。其中 SOUI 界面库是我工作中接触到的第一个开源的界面库,功能非常强大,感兴趣的同学可以点击这里 UI神奇-SOUI。
其实用的什么界面库在这里真的没有什么大的影响,因为都是同样封装了 wke 的浏览器内核来调用而已。那么 wke 是什么呢? wke 是 BlzFans (国内大神)对于 webkit 浏览器内核的一个小巧而又强大的封装库,可以实现浏览器内核的相关功能。
那么,怎么开始呢?我们就假设你已经有了一个可以访问网页的浏览器 demo 了,并且使用的是 wke 内核。接下来我们就一步一步的实现 js 和 c++ 之间的交互吧。
三、c++ 调用 js
首先,我们来实现稍微简单点的,c++ 调用 js。
如何实现呢?其实我们仔细翻看 wke.h 文件,就可以看到其实 blzFans 已经封装好了。我们打开 wke.h 文件,可以看到以下的两行代码:
virtual jsValue runJS(const utf8* script) = 0;
virtual jsValue runJS(const wchar_t* script) = 0;
通过函数名称,我们就可以推测这是调用 js 的方法,那么我们只需要在封装浏览器控件的地方,封装一个函数方法,调用 runJS()
方法即可。
这里我使用的是 SOUI 界面库,在 demo 里面已经封装好了一个基本成型的浏览器控件,这里直接在 SWkeWebkit
类中添加 RunJS()
方法即可:
SStringW SWkeWebkit::RunJS(SStringW strValue)
{
if (m_pWebView == NULL) return SStringW(L"wke 对象为空");
jsValue jsRet = m_pWebView->runJS(strValue);
return