cpp集成jerryscript

使用 cmake 集成 jerryscript

jerryscript

轻量级嵌入式 JavaScript 引擎

目录结构

CMakeLists.txt
main.cpp
vendor
  - jerryscript

集成

获取 jerryscript

git clone https://github.com/jerryscript-project/jerryscript.git vendor/jerryscript

CMakeLists.txt 如下:

cmake_minimum_required(VERSION 3.14)

project(test VERSION 0.0.1 LANGUAGES CXX)

# 使用 C++17 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 添加 JerryScript
add_subdirectory(vendor/jerryscript)

# 添加可执行文件
add_executable(test main.cpp)

# 链接 JerryScript 库
target_link_libraries(test PRIVATE jerry-core jerry-port jerry-ext)

main.cpp 如下:

#include "jerryscript.h"
#include <iostream>

int main(void)
{
  const jerry_char_t script[] = "var str = 'Hello, World!'; str;";
  const jerry_length_t script_size = sizeof(script) - 1;

  jerry_init(JERRY_INIT_EMPTY);

  // 执行 JS 脚本
  jerry_value_t eval_ret = jerry_eval(script, script_size, JERRY_PARSE_NO_OPTS);

  if (!jerry_value_is_exception(eval_ret) && jerry_value_is_string(eval_ret)) {
    // 获取字符串大小
    jerry_size_t size = jerry_length_t(eval_ret);

    jerry_char_t buffer[128] = {0};  // 假设字符串不会超出 128 字节

    jerry_string_to_buffer(eval_ret, JERRY_ENCODING_UTF8, buffer, size);
    buffer[size] = '\0';

    std::cout << "JS return: " << buffer << std::endl;
  } else {
    std::cerr << "JS no return!" << std::endl;
  }

  jerry_value_free(eval_ret);
  jerry_cleanup();

  return 0;
}

测试

mkdir build
cd build
cmake ..
make -j7
./test

输出:

JS return: Hello, World!

jerryscript REPL

在 build 目录下还会额外生成 jerry 可执行文件

jerry> var test=0;for(i=0;i<10;++i) test+=i; print(test);
45
undefined

comment: