C++调用quickJS

4 篇文章 0 订阅

quickJS官网

  1. 环境安装

  1. ubuntu:

下载源码

进入到源码目录

sudo make&&make install

  1. arm:

备份ubuntu下编译生成的qjsc和qis文件

make clean

替换Makefile中的gcc,改为arm-linux-gnueabihf-gcc

make

此时编译会报错,将生成的qjsc改为arm-qjsc备份,然后将原先备份的qjsc复制到当前目录,重新make,然后将生成生成的qjs命名为arm-qjs,将两份arm版本的文件放到arm开发板上

  1. quickjs简单应用

添加库文件

编写测试程序

#include <cstring>
#include "quickjs-libc.h"
int main(int argc, char **argv)
{
    JSRuntime *rt = JS_NewRuntime();
    JSContext *ctx = JS_NewContext(rt);
    js_std_add_helpers(ctx,0, nullptr);
    const char *scripts = "console.log('hello,quickJS!')";
    JS_Eval(ctx,scripts,strlen(scripts),"main",0);
    JS_FreeContext(ctx);
    JS_FreeRuntime(rt);
    return 0;
}

js函数调用,无参数

#include <iostream>
#include "quickjs-libc.h"
int main(int argc, char **argv)
{
    JSRuntime *rt = JS_NewRuntime();
    JSContext *ctx = JS_NewContext(rt);
    std::string jsCode = R"(
        function calculate(){
            return 1+2;
        }
        calculate();
    )";
    JSValue jsValue=JS_Eval(ctx,jsCode.c_str(),jsCode.length(),"<eval>",JS_EVAL_TYPE_GLOBAL);
    double dValue;
    if(JS_ToFloat64(ctx,&dValue,jsValue))
    {
        JS_FreeValue(ctx,jsValue);
        JS_FreeContext(ctx);
        JS_FreeRuntime(rt);
        return 0;
    }
    std::cout<<"calculate "<<dValue<<std::endl;
    JS_FreeValue(ctx,jsValue);
    JS_FreeContext(ctx);
    JS_FreeRuntime(rt);
    return 0;

js传参函数

#include <iostream>
#include "quickjs-libc.h"
int main(int argc, char **argv)
{
    //运行时
    JSRuntime *rt = JS_NewRuntime();
    //上下文
    JSContext *ctx = JS_NewContext(rt);
    std::string jsCode = R"(
        function calculate(num1, num2, operator){
            switch(operator){
                case '+':
                    return num1 + num2;
                case '-':
                    return num1 - num2;
            }
        }
    )";

    JSValue jsRes=JS_Eval(ctx,jsCode.c_str(),jsCode.length(),"<evalScript>",JS_EVAL_TYPE_GLOBAL);
    if (JS_IsException(jsRes))
    {
        js_std_dump_error(ctx);
        return 0;
    }
    JS_FreeValue(ctx, jsRes);
    //参数设置
    double dNum1 = 10,dNum2 = 20;
    std::string strOperator = "+";
    JSValue arg[3];
    arg[0] = JS_NewFloat64(ctx,dNum1);
    arg[1] = JS_NewFloat64(ctx,dNum2);
    arg[2] = JS_NewString(ctx,strOperator.c_str());
    //函数绑定
    JSValue jsObject = JS_GetGlobalObject(ctx);
    JSValue jsCalculate = JS_GetPropertyStr(ctx,jsObject ,"calculate");
    JS_FreeValue(ctx,jsObject);
    JS_FreeValue(ctx,jsCalculate);
    //调用函数
    JSValue jsResult= JS_Call(ctx,jsCalculate,JS_UNDEFINED,3,(JSValueConst *)arg);
    if (JS_IsException(jsResult))
    {
        js_std_dump_error(ctx);
        return 0;
    }

    //释放资源
    JS_FreeValue(ctx,arg[2]);
    JS_FreeValue(ctx,arg[1]);
    JS_FreeValue(ctx,arg[0]);
    double dValue;
    if(JS_ToFloat64(ctx,&dValue,jsResult))
    {
        std::cout<<" Call error "<<std::endl;
        JS_FreeContext(ctx);
        JS_FreeRuntime(rt);
        return 0;
    }
    JS_FreeValue(ctx, jsResult);
    std::cout<<"calculate "<<dNum1<<" "<<strOperator<<" "<<dNum2<<" = "<<dValue<<std::endl;
    JS_FreeContext(ctx);
    JS_FreeRuntime(rt);
    return 0;
}

PS:注意JSValue的释放回收,每一个上下文相关的JSValue在释放运行时,均需要被释放

list参数测试

/* File generated automatically by the QuickJS compiler. */

#include <iostream>
#include "quickjs-libc.h"
#include "cutils.h"
#include <list>
int main(int argc, char **argv)
{
    //运行时
    JSRuntime *rt = JS_NewRuntime();
    //上下文
    JSContext *ctx = JS_NewContext(rt);

    std::string jsCode = R"(
        function CalCrc16(data){
            let crcValue = 0xffff;
            for (let i = 0; i < data.length; i++) {
                crcValue ^= data[i] & 0xffff;
                for (let j = 0; j < 8; j++) {
                    if (crcValue & 0x0001) {
                        crcValue >>= 1;
                        crcValue ^= 0xa001;
                    } else {
                        crcValue >>= 1;
                    }
                }
            }
            let str = crcValue.toString(16).padStart(4, "0");
            let crcArr = [str.substr(2, 4), str.substr(0, 2)];
            data.push(str.substr(2, 4));
            data.push(str.substr(0, 2));
            return data;
        }
    )";

    JSValue jsRes=JS_Eval(ctx,jsCode.c_str(),jsCode.length(),"<eval>",JS_EVAL_TYPE_GLOBAL);
    if (JS_IsException(jsRes))
    {
        js_std_dump_error(ctx);
        return 0;
    }
    JS_FreeValue(ctx, jsRes);

    std::list<uint8_t> ls_nArray;
    ls_nArray.push_back(0x01);
    ls_nArray.push_back(0x03);
    ls_nArray.push_back(0x00);
    ls_nArray.push_back(0x00);
    ls_nArray.push_back(0x00);
    ls_nArray.push_back(0x01);

    JSValue jsArray=JS_NewArray(ctx);
    int i=0;
    for(auto ptr:ls_nArray)
    {
        JS_SetPropertyUint32(ctx, jsArray, i, JS_NewUint32(ctx, ptr));
        i++;
    }
    JSValue jsObject = JS_GetGlobalObject(ctx);
    JSValue jsCalculate = JS_GetPropertyStr(ctx,jsObject ,"CalCrc16");
    JS_FreeValue(ctx,jsObject);
    JS_FreeValue(ctx,jsCalculate);
    //函数调用
    JSValue jsResult= JS_Call(ctx,jsCalculate,JS_UNDEFINED,1,(JSValueConst *)&jsArray);
    if (JS_IsException(jsResult))
    {
        js_std_dump_error(ctx);
        return 0;
    }
    JS_FreeValue(ctx,jsArray);
    std::string strValue;
    strValue=JS_ToCString(ctx,jsResult);
    std::cout<<"ans:"<<strValue<<std::endl;

    JS_FreeValue(ctx, jsResult);

    JS_FreeContext(ctx);
    JS_FreeRuntime(rt);
    return 0;
}

quickJS脚本简单实例

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值