C 程序调用 JavaScript 函数
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
由于两者的数据类型上有较大的差异,因此无法直接从 C 代码中调用 JavaScript 代码,需要通过一定的转化,将 C 的变量转换为 JavaScript 可以设别的变量类型,然后进行参数的传递,返回值的处理也同样要经过转换。
我们在 JavaScript 中定义一个函数 add,这个函数接受两个参数然后返回传入的两个参数 的和。定义如下:
function add(x, y){
return x + y;
}
然后,我们在 C 语言中根据名称调用这个 JS 函数:
JSBool func_test(JSContext *context){
jsval res;
JSObject *global = JS_GetGlobalObject(context);
jsval argv[2];
//new 2 number to pass into the function "add" in script
JS_NewNumberValue(context, 18.5, &res);
argv[0] = res;
JS_NewNumberValue(context, 23.1, &res);
argv[1] = res;
JS_CallFunctionName(context, global, "add", 2, argv, &res);
jsdouble d;
//convert the result to jsdouble
JS_ValueToNumber(context, res, &d);
printf("add result = %f\n", d);
return JS_TRUE;
}
这里需要注意的是,JS_CallFunctionName 函数的参数列表:
JSBool JS_CallFunctionName(JSContext *cx, JSObject *obj,
const char *name, uintN argc, jsval *argv, jsval *rval);
名称 | 类型 | 类型描述 |
---|---|---|
cx | JSContext * | 上下文定义 |
obj | JSObject * | 调用该方法的对象 |
name | const char * | 函数名 |
argc | uintN | 函数参数个数 |
argv | jsval * | 函数实际参数形成的数组 |
rval | jsval * | 返回值 |
参数中的 argv 是一个 jsval 形成的数组,如果直接传递 C 类型的值,则很容易出现 core dump(Linux 下的段错误所导致),因此,需要 JS_NewNumberValue 函数转换 C 语言的 double 到 number(原因见对象转换小节)。
在线练习
{$ activeFileHint $}