Как интегрировать пользовательский модуль C ++ в пользовательскую версию NodeJS? - PullRequest
0 голосов
/ 01 июня 2018

Я хочу создать исполняемый файл, который использует NodeJS для запуска определенного файла JavaScript.Однако в этот NodeJS должны быть добавлены дополнительные «модули», которые открывают классы / функции C ++ для области JavaScript, используя require.

. До сих пор я успешно скомпилировал NodeJS в библиотеку и связал его с моимсупер простая программа на C ++:

#include <vector>

#include "node.h"

int main(int argc, char* argv[]) {
    std::vector<char*> newArgs;

    newArgs.push_back(argv[0]);

    char file[] = "my_file.js";
    newArgs.push_back(file);

    return node::Start(2, &newArgs[0]);
}

Как вы можете сказать, это просто выполняет файл JavaScript с именем "my_file.js" в том же каталоге исполняемого файла.

Теперь вопрос в том,Как я могу представить потенциальные классы / функции C ++, которые я создаю в этом коде, JavaScript?


Например, я хотел бы сделать что-то вроде этого:

#include <vector>
#include <iostream>

#include "node.h"

class Weather {
public:
    Weather() {}
    void makeItRain() {
        std::cout << "It is raining\n";
    }
};

int main(int argc, char* argv[]) {
    std::vector<char*> newArgs;

    newArgs.push_back(argv[0]);

    char file[] = "my_file.js";
    newArgs.push_back(file);

    // hypothetical code
    node::AddClass(Weather, "weather");

    return node::Start(2, &newArgs[0]);
}

// my_file.js
var Weather = require("weather");
var w = new Weather();
w.makeItRain();

Есть предложения?Самое близкое, что я нашел, это v8pp , но я не знаю, как получить экземпляр v8 :: Isolate.

1 Ответ

0 голосов
/ 01 июня 2018

То, о чем вы спрашиваете, называется «аддоном», и здесь есть много официальной документации: https://nodejs.org/api/addons.html

Это не так просто, как гипотетический код в вашем вопросе, но основнойПринцип тот же.Немного больше кода требуется для того, чтобы соединить миры C ++ и JavaScript (имейте в виду, что один из них собирает мусор, в то время как другой выполняет ручное управление памятью; один компилируется заранее, а другой поставляется как источник).

Обратите внимание на раздел «N-API».По умолчанию вы будете программировать с C ++ API V8, который иногда меняется между версиями.Чтобы сделать ваши аддоны совместимыми с максимально возможным количеством версий Node / V8, N-API предоставляет уровень абстракции, который разработан так, чтобы быть стабильным во времени.

...