4

Awesomiumでは、C ++コードでJavascriptメソッドを簡単に呼び出すことができますが、逆のことができるかどうかについて明確な答えは見つかりませんでした。このサイトはあなたができると言っているようですが、テキストと例を見ても私は啓発されません。

だから、私は明確な答えを探しています:Javascript(Jquery)でC ++変数/メソッドを呼び出すことはできますか?

簡単な例を含めることができれば、それも非常にありがたいです。

ありがとうございました!

4

1 に答える 1

14

間違いなく可能です。デリゲート/関数ポインターを使用して、WebView::setObjectCallbackとWebViewListener::onCallbackの上に追加のレイヤーを構築する必要があります。

「onCallback」イベントをC++メンバー関数に直接フックアップするために使用できる簡単なJSDelegate.hクラス(ここで表示)を作成しました。

基本的な考え方は、コールバック名からデリゲートへのマッピングを維持することです。

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 v​​1.6RC4SDKを念頭に置いて作成しました。

于 2011-04-07T03:07:29.283 に答える