Awesomium 很容易允许 C++ 代码调用 Javascript 方法,但我还没有找到一个明确的答案,它是否可以做相反的事情。该站点似乎说您可以,但是通过文本和示例查看并不能启发我。
所以,我正在寻找一个明确的答案:我可以在我的 Javascript(Jquery) 中调用 C++ 变量/方法吗?
如果您可以包含一个简单的示例,那也将非常感激。
谢谢!
Awesomium 很容易允许 C++ 代码调用 Javascript 方法,但我还没有找到一个明确的答案,它是否可以做相反的事情。该站点似乎说您可以,但是通过文本和示例查看并不能启发我。
所以,我正在寻找一个明确的答案:我可以在我的 Javascript(Jquery) 中调用 C++ 变量/方法吗?
如果您可以包含一个简单的示例,那也将非常感激。
谢谢!
你绝对可以——你只需要使用委托/函数指针在 WebView::setObjectCallback 和 WebViewListener::onCallback 之上构建一个额外的层。
我编写了一个快速的 JSDelegate.h 类(在此处查看),您可以使用该类将“onCallback”事件直接连接到 C++ 成员函数。
基本思想是维护回调名称到委托的映射:
typedef std::map<std::wstring, Awesomium::JSDelegate> DelegateMap;
DelegateMap _delegateMap;
并从您的 WebViewListener::onCallback 调用相应的函数:
void MyListener::onCallback(Awesomium::WebView* caller, const std::wstring& objectName,
const std::wstring& callbackName, const Awesomium::JSArguments& args)
{
DelegateMap::iterator i = _delegateMap.find(callbackName);
if(i != _delegateMap.end())
i->second(caller, args);
}
然后,每次你想绑定一个特定的 C++ 函数时,你会这样做:
// Member function we wish to bind, must have this signature for JSDelegate
void MyClass::myFunction(Awesomium::WebView* caller, const Awesomium::JSArguments& args)
{
// handle args here
}
// Instantiate MyClass instance in C++
MyClass* myClass = new MyClass();
// Create corresponding 'MyClass' object in Javascript
webView->createObject(L"MyClass");
// Do the following for each member function:
// Bind MyClass::myFunction delegate to MyClass.myFunction in JS
_delegateMap[L"myFunction"] = Awesomium::JSDelegate(myClass, &MyClass::myFunction);
webView->setObjectCallback(L"MyClass", L"myFunction");
然后,您应该可以直接从 Javascript 调用 MyClass::myFunction ,如下所示:
MyClass.myFunction("foo", 1, 2 3)
希望这可以帮助!我没有测试任何代码,但我在编写时考虑了Awesomium v1.6 RC4 SDK。