完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
名词解释
AliOS Things: 阿里云智能IoT团队自研的物联网操作系统 HaaS:全称是Hardware as a Service,阿里云智能IoT团队基于AliOS Things系统推出的硬件即服务 HaaS UI:全称是Hardware as a Service User Interface,是源自AliOS Things操作系统上的一套应用&图形解决方案,支持C/C++和 JS两种开发语言 Native调用JS实现(Native -> JS) 前面讲了JS中调用Native的功能,有时候Native中也需要调用JS的代码,比如在timer在设置时间到后,就需要调用对应的JS函数;我们还是以timer为例; 在JS中我们先设置需要回调JS方法: timer.setListener((count, internal) => { console.log("listener", count, internal); }); timer.start(); setListener是正常的JS调用Native的方法,我们将回调函数的JSValue值先保存下来,以便之后时间到了回调: static JSValue js_timer_setListener(JSContext* ctx, JSValueConst this_val, int argc, JSValueConst* argv) { if (JS_IsFunction(ctx, argv[0])) { g_JSTimer.mJSListener = JS_DupValue(ctx, argv[0]); return JS_NewInt32(ctx, 0); } return JS_EXCEPTION; } 注意这里我们用了JS_DupValue,而不是直接赋值,因为在js_timer_setListener运行完之后argv中的参数也会被回收; 接着JS中调用了start,Native中对应实现如下: void* js_timer(void* arg) { while (g_JSTimer.mIsStart) { sleep(g_JSTimer.mInternal); g_JSTimer.mCount++; JQuick::Task* timeTask = new TimeTask(timeTrigger); g_JSTimer.mJSHandle->post(timeTask); } return nullptr; } bool JSTimer::start() { if (mIsStart) { return true; } mIsStart = true; mJSHandle = new JQuick::Handler(JQuick::Looper::myLooper()); jquick_thread_create("js_timer", &js_timer, nullptr); return true; } static JSValue js_timer_start(JSContext* ctx, JSValueConst this_val, int argc, JSValueConst* argv) { // check the js callback has be set // if (!JS_IsFunction(ctx, g_JSTimer.mJSListener)) { return JS_EXCEPTION; } g_JSTimer.mJSContext = ctx; return JS_NewBool(ctx, g_JSTimer.start()); } 在start中,我们启了一个新的线程来进行计时,在时间到后我们创建一个timeTrigger的任务,让JS线程来回调注册的JS Listener; 注意:这里我们没有直接在新创建的子线程中调用timeTrigger,而是把这个任务交给刚才调用start的JS线程来做,这是因为JS运行都必须在同一个线程中,否则会出现各种错误; 接下来我们来看看timeTrigger的实现: void timeTrigger() { if (!g_JSTimer.mIsStart) { return; } JSValue jsInternal = JS_NewInt64(g_JSTimer.mJSContext, g_JSTimer.mInternal); JSValue jsCount = JS_NewInt32(g_JSTimer.mJSContext, g_JSTimer.mCount); JSValue v[2] = {jsCount, jsInternal}; printf("[timer] JS_Calln"); JSValue ret = JS_Call(g_JSTimer.mJSContext, g_JSTimer.mJSListener, JS_UNDEFINED, 2, v); if (JS_IsException(ret)) { JSValue exception_val = JS_GetException(g_JSTimer.mJSContext); dump_obj(g_JSTimer.mJSContext, exception_val); BOOL is_error = JS_IsError(g_JSTimer.mJSContext, exception_val); if (is_error) { JSValue val = JS_GetPropertyStr(g_JSTimer.mJSContext, exception_val, "stack"); if (!JS_IsUndefined(val)) { dump_obj(g_JSTimer.mJSContext, val); } JS_FreeValue(g_JSTimer.mJSContext, val); } JS_FreeValue(g_JSTimer.mJSContext, exception_val); } JS_FreeValue(g_JSTimer.mJSContext, jsInternal); JS_FreeValue(g_JSTimer.mJSContext, jsCount); JS_FreeValue(g_JSTimer.mJSContext, ret); } 通过JS_Call,我们就调用到了JS中的代码,运行结果如下: 这里有一点需要注意:所有我们创建,调用JS函数返回的JSValue对象,在函数退出前都要调用JS_FreeValue进行释放,否则会出现内存泄漏; 文章转载自:平头哥芯片开放社区 作者:sucool |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
【平头哥Sipeed LicheeRV 86开发板试用体验】Waft初体验
15638 浏览 1 评论
13682 浏览 4 评论
【平头哥Sipeed LicheeRV 86开发板试用体验】四、烧写waft系统&搭建waft测试环境
19601 浏览 2 评论
58982 浏览 19 评论
【限时福利】加入芯片开发社区,领100G电子工程师资料大礼包
87518 浏览 121 评论
邀请函 | 3月2日 来上海参加平头哥“玄铁RISC-V生态大会”
722浏览 0评论
读书分享会 | 玄铁RISC-V处理器入门与实战电子书免费下载!
613浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-6 11:24 , Processed in 0.876510 second(s), Total 69, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号