Я новичок в c ++, ниже я нашел в интернете: js-код вызывает функцию c ++, а из c ++ другая функция вызывает другую функцию js.
В основном это работает так: js ---> c ++ ---> c ++ ---> js
ЯШ:
var addon = require('bindings')('hello');
// console.log(addon);
// addon.simple();
function foo() {
console.log("woohoo!");
}
addon.setCallback(foo);
addon.call(() => console.log("call!")) ;
addon.callThis(() => console.log("this too!"));
C ++:
#include <node.h>
#include <nan.h>
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::NewStringType;
using v8::Object;
using v8::String;
using v8::Value;
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", RunThisCallback);
Nan::SetMethod(exports, "callThis", RunThisCallback);
}
NODE_MODULE(NODE_GYP_MODULE_NAME, Init);
Это работает автономно, и когда я попытался интегрировать тот же код с другим проектом, я получил эту ошибку:
example_wrap.obj: ошибка LNK2005: _register_example_ уже определено
в example.obj [C: \ Users \ UAL \ Desktop \ PentaScannerE
lectronDemoForCallback \ сборка \ example.vcxproj]
Создание библиотеки C: \ Users \ UAL \ Desktop \ PentaScannerElectronDemoForCallback \ build \ Release \ example.lib
и объект C: \
Пользователи \ UAL \ Desktop \ PentaScannerElectronDemoForCallback \ построить \ Release \ example.exp
C: \ Users \ UAL \ Desktop \ PentaScannerElectronDemoForCallback \ сборки \ Release \ example.node
: фатальная ошибка LNK1169: найден один или несколько кратно определенных символов
[C: \ Users \ UAL \ Desktop \ PentaScannerElectronDemoForCallback \ построить \ example.vcxproj]
Я думаю, что он пытается создать еще один пакет, который уже существует.
Моя цель - вызвать функцию callThis()
из метода, который находится в c ++. Я считаю, что NODE_MODULE(NODE_GYP_MODULE_NAME, Init);
(если я не ошибаюсь) - это код, который делает это. Как я могу вызвать это из метода:
который мог бы что-то вроде этого
callJSFunction(){
NODE_MODULE(NODE_GYP_MODULE_NAME, Init);
}
или любым другим способом, который соответствует моему требованию.