- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下类(class):
class PluginManager
{
public:
Handle<Value> Register(const Arguments& args);
Handle<ObjectTemplate> GetObjectTemplate();
};
我希望可以从 JavaScript 访问 Register 方法。我像这样将它添加到全局对象中:
PluginManager pluginManagerInstance;
global->Set(String::New("register"), FunctionTemplate::New(pluginManagerInstance.Register));
它抛出以下错误:
'PluginManager::Register': function call missing argument list; use '&PluginManager::Register' to create a pointer to member
我试过这样做,但也没用。这是不正确的,因为我希望它调用 pluginManagerInstance 的 Register 方法。
除了让 Register 方法成为静态的或全局的,还有什么想法吗?
谢谢。
最佳答案
您正试图同时绑定(bind)两件事:实例和要在其上调用的方法,并使其看起来像一个函数指针。不幸的是,这在 C++ 中不起作用。您只能将指针绑定(bind)到普通函数或静态 方法。因此,假设您添加了一个静态“RegisterCB”方法并将其注册为回调:
static Handle<Value> RegisterCB(const Arguments& args);
...FunctionTemplate::New(&PluginManager::RegisterCB)...
现在你从哪里得到 pluginManagerInstance?为此,V8 中的大多数回调注册 api 都有一个额外的“数据”参数,该参数将传递回回调。 FunctionTemplate::New 也是如此。所以你实际上想像这样绑定(bind)它:
...FunctionTemplate::New(&PluginManager::RegisterCB,
External::Wrap(pluginManagerInstance))...
然后可以通过 args.Data() 获取数据,您可以委托(delegate)给实际的方法:
return ((PluginManager*)External::Unwrap(args.Data())->Register(args);
这肯定可以通过一些宏变得更容易一些。
关于c++ - V8 FunctionTemplate 类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3171418/
我正在使用 V8 为应用程序添加 JavaScript 支持。由于各种我无法理解的原因,我们需要能够向 FunctionTemplate 添加方法,并让这些方法出现在已经从它继承的任何 Functio
我有一个函数设置为在调用时返回一个包装的 C++ 对象 new MyClass(); 但我也想说 MyClass.do_something(); 我知道如何用纯 javascript 做我想做的事:
Google 的 v8 文档描述了如何将全局函数添加到 JavaScript 上下文。我们可以使用 C++11 中的新 lambda 功能非常轻松地实现类似 printf 的函数: Handle gl
我有一些代码使用了 V8 FunctionTemplates。它是旧 Node.js 模块的一部分,充当 C++ 库的包装器。 void NNet::PrototypeInit(Local t) {
我有以下类(class): class PluginManager { public: Handle Register(const Arguments& args); Handle G
我有一个非常简单的初始化 v8 的方法,我无法追踪原因(其他 v8 的东西工作得很好): void JavascriptEngine::init() { m_platform = v8::pl
我读过上一个问题 here但似乎有点无关紧要。 C++ lambda,当它没有捕获任何东西时,可以作为 v8::FunctionTemplate 的参数。 .但是当它捕捉到我需要的东西时,编译器开始提
我刚开始通过 v8 扩展(按照 Node.JS docs 和 v8 API docs 上的说明)编写到 C 库的绑定(bind)(准确地说是链接语法)。 我的问题是出现以下构建错误: /usr/inc
请考虑以下基于 v8 的 sample.cc 示例 shell 的代码片段,它会导致段错误: int RunMain(int argc, char* argv[]) { v8::V8::SetFl
我是一名优秀的程序员,十分优秀!