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