2011-04-05 62 views
4

Awesomium很容易允許C++代碼調用Javascript方法,但我還沒有找到明確的答案,如果它可以做相反的事情。 This site似乎可以說,你可以,但通過文字和例子看並不開導我。因此,我正在尋找一個明確的答案:我可以在我的Javascript(jquery)中調用C++變量/方法,還是不?Awesomium是否允許我在JS中調用/使用C++變量/方法?

如果你可以包括一個簡單的例子,那也將非常感激。

謝謝!

回答

14

你當然可以 - 你只需要使用委託/函數指針在WebView :: setObjectCallback和WebViewListener :: onCallback之上構建一個額外的圖層。

我寫了一個快速JSDelegate.h類(view it here),您可以使用它將「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時寫了它。

+0

爲了簡單起見,上面的代碼只映射基於回調名稱的函數 - DelegateMap的typedef實際上應該是std :: map ,JSDelegate >爲一對對象名稱+回調名稱。 – Adam 2011-04-07 03:13:09

+0

謝謝,這絕對是一個很好的答案。你付出了很多努力。即使這不會最終爲我工作,我仍然會對這個主題有更好的理解。 – Briz 2011-04-07 13:46:31

+0

沒問題,很高興幫助。 :-) – Adam 2011-04-07 16:59:54

相關問題