引用Duktape

​ 最近项目中需要使用JS引擎,在经历了V7引擎的正则表达式存在Bug、V8引擎实现多线程操作资源占用太大导致软件崩溃后,从网上找到Duktape引擎。Duktape 引擎对ECMAScript兼容性较好且项目比较活跃,授权协议为MIT。

引用Duktape

只需要将duktape.hduktape.cduk_config.h 添加到VS工程即可。

定义导出类

class CLog
{
public:
    CLog () {}
    void Info(const char* msg) {
        printf("[Info] %s\n", msg);
    }

    void Err(const char* msg) {
        printf("[Err] %s\n", msg);
    }

    void Warn(const char* msg) {
        printf("[Warn] %s\n", msg);
    }    
};

声明全局对象及操作函数

static CLog s_log;

static duk_ret_t Info(duk_context *ctx) {
    const char *msg = duk_safe_to_string(ctx, 0);

    duk_push_current_function(ctx);
    duk_get_prop_string(ctx, -1, "_ptr");
    CLog *log = static_cast<CLog*>(duk_to_pointer(ctx, -1));

    log->Info(msg);

    duk_push_boolean(ctx, 1);
    return 1;
}

static duk_ret_t Warn(duk_context *ctx) {
    const char *msg = duk_safe_to_string(ctx, 0);

    duk_push_current_function(ctx);
    duk_get_prop_string(ctx, -1, "_ptr");
    CLog *log = static_cast<CLog*>(duk_to_pointer(ctx, -1));

    log->Warn(msg);

    duk_push_boolean(ctx, 1);
    return 1;
}

static duk_ret_t Err(duk_context *ctx) {
    const char *msg = duk_safe_to_string(ctx, 0);

    duk_push_current_function(ctx);
    duk_get_prop_string(ctx, -1, "_ptr");
    CLog *log = static_cast<CLog*>(duk_to_pointer(ctx, -1));

    log->Err(msg);

    duk_push_boolean(ctx, 1);
    return 1;
}

static duk_ret_t GetMsg(duk_context *ctx) {
    duk_push_string(ctx, "测试 Test");
    return 1;
}

声明导出对象函数

void AddLogObj(duk_context *ctx) {
    struct {
        const char      *name;
        duk_c_function  fn;
    } fnItems[] = {
        {"Info"     , Info},
        {"Warn"     , Warn},
        {"Err"      , Err},
        {"GetMsg"   , GetMsg}
    };

    duk_push_global_object(ctx);
    duk_push_object(ctx);

    size_t fnCnt = sizeof(fnItems)/sizeof(fnItems[0]);
    for (size_t i = 0; i < fnCnt; ++i) {
        duk_push_c_function(ctx, fnItems[i].fn, 1);
        duk_push_pointer(ctx, &s_log);
        duk_put_prop_string(ctx, -2, "_ptr");
        duk_put_prop_string(ctx, -2, fnItems[i].name);
    }

    duk_put_prop_string(ctx, -2, "Log");
}

程序入口函数

int main(int argc, char *argv[]) {
    duk_context *ctx;

    if (argc < 2) { exit(1);}

    ctx = duk_create_heap_default();
    if (!ctx) { exit(1);}

    AddLogObj(ctx);

    duk_eval_string(ctx, "print(Log.Info(123)); print(Log.GetMsg());");


    duk_destroy_heap(ctx);    
    return 0;
}

代码下载

http://download.csdn.net/detail/sdhongjun/9609026

参考资料

https://github.com/civetweb/civetweb/blob/master/src/mod_duktape.inl

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sdhongjun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值