环境安装
ubuntu:
下载源码
进入到源码目录
sudo make&&make install
arm:
备份ubuntu下编译生成的qjsc和qis文件
make clean
替换Makefile中的gcc,改为arm-linux-gnueabihf-gcc
make
此时编译会报错,将生成的qjsc改为arm-qjsc备份,然后将原先备份的qjsc复制到当前目录,重新make,然后将生成生成的qjs命名为arm-qjs,将两份arm版本的文件放到arm开发板上
quickjs简单应用
添加库文件
![](https://i-blog.csdnimg.cn/blog_migrate/394f5c05a2a8df1cfbba90160bbee96e.jpeg)
编写测试程序
#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;
}