2016-07-19 15 views
1

私の問題を解決するにはいくつかの助けが必要です。 基本的に、私はC++アドオンからjavascript関数を "呼び出す"ために、私はそれについてgoogledして、このようなものを見つけました。ここでC++アドオンからjavascript関数を呼び出す

は私の.jsがここ

const myaddon = process.binding('myaddon'); 

function Foo() { 
    console.log("wooo"); 
} 
myaddon.getfoo(Foo); 
myaddon.callfoo(); // just to test if C++ Call js function work 

ファイルである私の.cppはmyaddon.callfoo();関数を呼び出すときに私はこのエラーを得た

Local<Function> pfOnScriptInit; 
Local<Object> globel; 
void test(const FunctionCallbackInfo<Value>& args) 
{ 
    pfOnScriptInit = Local<Function>::Cast(args[0]); 
} 
void call(const FunctionCallbackInfo<Value>& args) 
{ 
    pfOnScriptInit->Call(globel, 0, nullptr); 
} 
void initAll(Local<Object> target, Local<Value> unused, Local<Context> context, void* priv) 
{ 
    node::Environment* env = node::Environment::GetCurrent(context); 

    globel = env->context()->Global(); 
    env->SetMethod(target, "getfoo", test); 
    env->SetMethod(target, "callfoo", call); 
} 
NODE_MODULE_CONTEXT_AWARE_BUILTIN(fivemp, node::fivemp::initAll) 

です:

TypeError: Illegal Invocation

答えて

2

この質問はちょっと古いですそれは一般的な質問ですが、これは尋ねられました。coupletimes 。これらの答えは私の意見では適切な答えを持っていません。それで、ここに行きます!

私があなたの質問に答える前に、Node.jsアドオンを書くためにNode.jsのネイティブ抽象概念を使うべきだと言います。これにより、Node.jsバージョン間でアドオンを移植することができます。

また、公式のアドオンドキュメントhere、およびrepoのNanサンプルをご覧ください。

つまり、コードには大きな間違いがあります。ローカルオブジェクトを混乱させて混乱させてしまいます。言い換えると、関数スコープの外にLocal<Function>を宣言するのは間違っています。これら二つはどこにもなく、関数スコープ内で宣言することはできません。

Local<Function> pfOnScriptInit; 
Local<Object> globel; 

そしてもちろん、あなたがこのようなLocal<Function>を割り当てることができません。

pfOnScriptInit = Local<Function>::Cast(args[0]); 

このローカルオブジェクトはV8のガベージコレクタによって回収されようとしています - それはもはや存在しません。その代わりにpersistentタイプを使用する必要があります。

#include <nan.h> 

static Nan::CopyablePersistentTraits<v8::Function>::CopyablePersistent _cb; 

static void SetCallback(const Nan::FunctionCallbackInfo<v8::Value>& info) { 
    _cb = Nan::Persistent<v8::Function>(info[0].As<v8::Function>()); 
} 

static void RunCallback(const Nan::FunctionCallbackInfo<v8::Value>& info) { 
    Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(_cb), 0, 0); 
    _cb.Reset(); 
} 

void RunThisCallback(const Nan::FunctionCallbackInfo<v8::Value>& info) { 
    v8::Local<v8::Function> cb = info[0].As<v8::Function>(); 
    Nan::MakeCallback(Nan::GetCurrentContext()->Global(), cb, 0, 0); 
} 

static void Init(v8::Local<v8::Object> exports, v8::Local<v8::Object> module) { 
    Nan::SetMethod(exports, "setCallback", SetCallback); 
    Nan::SetMethod(exports, "call", RunCallback); 
    Nan::SetMethod(exports, "callThis", RunThisCallback); 
} 

NODE_MODULE(addon, Init) 

そして、ここでは、JS側だ:ここではどのように行うのあなたが表示される場合がありますナン、使用して書かれた、一例であるV8のローカル永続的な対の詳細については

var addon = require('bindings')('addon'); 

function foo() { 
     console.log("woohoo!"); 
} 

addon.setCallback(foo); 
addon.call(); 
addon.callThis(() => console.log("this too!")); 

を、あなたが取る必要がありますv8のドキュメントを見てください。 Scott FreesのNode.jsアドオンについては、https://scottfrees.com/ebooks/nodecpp/の良い本もあります。

関連する問題