Я пытаюсь использовать JXCore для вызова некоторого кода node.js внутри моей программы на C ++. Я могу запустить мою программу на C ++ с прикрепленным кодом, если закомментирую строку: "var path = require('fs'); \n"
Таким образом, я в основном сузил свою проблему до использования команды «require». Код работает, если я запускаю его непосредственно из jx. Я также использую Visual Studio, если это имеет значение. Как вы скажете jx, где находятся дополнительные модули, такие как ‘fs’?
#include "stdafx.h"#include <windows.h>
using namespace std;
#include "jx.h"#include <node.h>
#include <v8.h>
#define flush_console(...) \
do { \
fprintf(stdout, __VA_ARGS__); \
fflush(stdout); \
} while (0)
void ConvertResult(JXValue *result, std::string &to_result) {
switch (result->type_) {
case RT_Null:
to_result = "null";
break;
case RT_Undefined:
to_result = "undefined";
break;
case RT_Boolean:
to_result = JX_GetBoolean(result) ? "true" : "false";
break;
case RT_Int32: {
std::stringstream ss;
ss << JX_GetInt32(result);
to_result = ss.str();
} break;
case RT_Double: {
std::stringstream ss;
ss << JX_GetDouble(result);
to_result = ss.str();
} break;
case RT_Buffer: {
to_result = JX_GetString(result);
} break;
case RT_JSON:
case RT_String: {
to_result = JX_GetString(result);
} break;
case RT_Error: {
to_result = JX_GetString(result);
} break;
default:
to_result = "null";
return;
}
}
void callback(JXResult *results, int argc) {
// do nothing
}
void sampleMethod(JXResult *results, int argc) {
flush_console("sampleMethod Called;\n");
std::stringstream ss_result;
for (int i = 0; i < argc; i++) {
std::string str_result;
ConvertResult(&results[i], str_result);
ss_result << i << " : ";
ss_result << str_result << "\n";
}
flush_console("%s", ss_result.str().c_str());
// return an Array back to JS Land
const char *str = "[1, 2, 3]";
// results[argc] corresponds to return value
JX_SetJSON(&results[argc], str, strlen(str));
}
void TEST_JSON(char * logger, int log_length, char *path)
{
JXValue result;JX_Evaluate(
"var path = require('fs'); \n""var FileParser = require('./FileParser'); \n""var eventDate; \n""var depth; \n""var moisture; \n""var pressure; \n""var code; \n""var message; \n""var token; \n""var results; \n""var action; \n"
"try { \n"
"console.log(); \n""console.log('//--------------------------------------------------------'); \n""console.log('// Hello'); \n""console.log(); \n""} catch (err) { \n""} \n", "myscript", &result);
JX_Free(&result);
// loop for possible IO
// or JX_Loop() without usleep / while//return 0;
}
void startNodeInitialize(char *path)
{
//char *path = args[0];
// Call JX_Initialize only once per app
JX_Initialize(path, callback);
// Creates a new engine for the current thread
// It's our first engine instance hence it will be the
// parent engine for all the other engine instances.
// If you need to destroy this engine instance, you should
// destroy everything else first. For the sake of this sample
// we have our first instance sitting on the main thread
// and it will be destroyed when the app exists.
JX_InitializeNewEngine();
char *contents = "console.log('hi world');";
// define the entry file contents
JX_DefineMainFile(contents);
// define native -named- method
// we will be reaching to this method from the javascript side like this;
// process.natives.sampleMethod( ... )
JX_DefineExtension("sampleMethod", sampleMethod);
JX_StartEngine();
}
void startNodeEngine(void)
{
// Creates a new engine for the current thread
// It's our first engine instance hence it will be the
// parent engine for all the other engine instances.
// If you need to destroy this engine instance, you should
// destroy everything else first. For the sake of this sample
// we have our first instance sitting on the main thread
// and it will be destroyed when the app exists.
JX_InitializeNewEngine();
char *contents = "console.log('hi world');";
// define the entry file contents
JX_DefineMainFile(contents);
// define native -named- method
// we will be reaching to this method from the javascript side like this;
// process.natives.sampleMethod( ... )
JX_DefineExtension("sampleMethod", sampleMethod);
JX_StartEngine();
}
Нашел ответ здесь: https://github.com/jxcore/jxcore/blob/master/test/native-interface/test-require/test-posix.cpp#L9
По сути, «требуется» должно быть определено в глобальном масштабе.
Других решений пока нет …