c++调用quickJS脚本简单实例

该代码示例展示了如何在C++程序中利用QuickJS库执行JavaScript代码,具体是调用名为`example.js`的文件,该文件包含两个函数:`StringToHex`将字符串转换为十六进制数组,`CalCrc16`计算CRC16校验和。C++代码创建了运行时环境,加载并执行JavaScript文件,然后调用这些函数对给定的字符串进行处理,并打印结果。
摘要由CSDN通过智能技术生成

example.js

function StringToHex(str) {   //string转hex
    let uint8Array = [];
    for (let i = 0; i < str.length; i += 2) {
        uint8Array.push( "0x" + str.substr(i, 2));
    }
    return uint8Array;
}

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;
}

main.cpp

#include <iostream>
#include "quickjs-libc.h"
#include "cutils.h"
#include <list>
#include "gtest/gtest.h"

using namespace std;
int quickJS()
{
    //运行时
    JSRuntime *rt = JS_NewRuntime();
    if(!rt)
        return -1;
    //上下文
    JSContext *ctx = JS_NewContext(rt);
    if(!ctx)
        return -1;
    const char *pJsFile = "example.js";
    //读取js文件
    uint8_t *pnBuf;
    size_t nBufLen;
    pnBuf = js_load_file(ctx,&nBufLen,pJsFile);

    JSValue jsRes=JS_Eval(ctx,(char *)pnBuf,nBufLen,pJsFile,JS_EVAL_TYPE_GLOBAL);
    if (JS_IsException(jsRes))
    {
        js_std_dump_error(ctx);
        return -1;
    }
    JS_FreeValue(ctx, jsRes);

    JSValue jsObject = JS_GetGlobalObject(ctx);
    JSValue funCalculate = JS_GetPropertyStr(ctx,jsObject ,"CalCrc16");
    JSValue funStringToHex = JS_GetPropertyStr(ctx, jsObject, "StringToHex");
    // 初始化测试值
    string a = "0103ff00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100011122";
    JSValue jsData = JS_NewString(ctx, a.c_str());
    // 函数调用1
    JSValue jsArray = JS_Call(ctx,funStringToHex,JS_UNDEFINED,1,(JSValueConst *)&jsData);
    //函数调用2
    JSValue jsResult = JS_Call(ctx,funCalculate,JS_UNDEFINED,1,(JSValueConst *)&jsArray);

    JS_FreeValue(ctx,jsObject);
    JS_FreeValue(ctx,funCalculate);
    JS_FreeValue(ctx, funStringToHex);
    if (JS_IsException(jsResult))
    {
        js_std_dump_error(ctx);
        return -1;
    }
    JS_FreeValue(ctx,jsData);
    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;
}

TEST(TestCase,test1){
    EXPECT_FALSE(quickJS())<<"判断quickjs";
    std::cout<<"this is a simple test!"<<std::endl;
}
int main(int argc, char **argv)
{
    testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值