现在的位置: 首页 > 综合 > 正文

你如何让Javascript和c直接互调?

2012年09月23日 ⁄ 综合 ⁄ 共 2973字 ⁄ 字号 评论关闭
以前我们的写一个程序可能只用一种语言,我用的最多就是c++,但是现在的局势和需求它已经不能满足我们的需求,很多程序都需要能有自己的皮肤,有更好的扩展性,最近研究了一下Firefox,它真把xml和js用到了极致!因为它内部就潜着自己的js引擎,所有的界面用XUL(其实就是XML),一些Action都用的js来写的,扩展性极强!所以我就自然想到为何我们不能用它的js引擎呢?有了它的js引擎我们可以很简单的让js和c互调了,firefox是开源的你可以到Mozilla的网站去下载js的源代码,js的dll你可以在firefox下找到一个叫js3250.dll的东东!

让我们先看看code:

 
#include <stdio.h>
#include 
<stdlib.h>
#include 
<string.h>

/* 包含JS引擎API头文件 */
#define    XP_WIN
#include 
"jsapi.h"

#define DOIT_MINARGS 1

static JSBool doit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
    
/*
    * Look in argv for argc actual parameters, set *rval to return a
    * value to the caller.
    
*/

    printf(
"Call doit function()  ");
    
if(argc > 0)
    
{
        printf(JS_GetStringBytes(JS_ValueToString (cx, argv[
0])));
    }

    
*rval = STRING_TO_JSVAL (JS_NewStringCopyZ (cx,"xingxing"));
    
return JS_TRUE;
}


/* 主程序建立全局JS变量,包括运行时,
* 一个上下文,和一个全局对象,然后初始化JS运行时,
* 并创建一个上下文. 
*/


int main(int argc, char **argv)
{
    
int c, i;
    
/*建立全局的JS变量,包括全局和自定义对象 */
    
    JSString
* jss;
    
char buf[5120= {0};
    jsval rval;
    JSVersion version;
    JSRuntime 
*rt;
    JSContext 
*cx;
    JSObject  
*glob, *it;
    JSBool builtins;
    
    
/* 初始化JS运行时,并返回结果给rt  */
    rt 
= JS_NewRuntime(8L * 1024L * 1024L);
    
    
/* 如果rt没有值,结束程序 */
    
if (!rt)
        
return 1;
    
    
/* 新建一个上下文并且把它和JS运行时相关联 */
    cx 
= JS_NewContext(rt, 8192);
    
    
/* 如果cx没有值,在此结束程序 */
    
if (cx == NULL)
        
return 1;
    
    JSClass global_class 
= {
        
"global",0,
            JS_PropertyStub, JS_PropertyStub,JS_PropertyStub, JS_PropertyStub,
            JS_EnumerateStub, JS_ResolveStub,JS_ConvertStub, JS_FinalizeStub }
;

    
/* 新建全局对象 */
    glob 
= JS_NewObject(cx, &global_class, NULL, NULL);
    
    
/* 初始化内置JS对象和全局对象 */
    builtins 
= JS_InitStandardClasses(cx, glob);

    
// 定义一个自定义函数到js中
    JS_DefineFunction(cx, glob, "doit", doit, DOIT_MINARGS, 0);

    
/*打开文件,读入脚本*/
    FILE 
*fp=NULL;
    
if (!(fp = fopen ("test.js""r")))return 0;
    
int len = fread (buf, 15120, fp);
    fclose (fp);
    
if (len <= 0)return 0;
    
/*执行一段脚本*/
    JSBool bOk 
= JS_EvaluateScript(cx, glob, buf, len, ""1&rval);
    
if (bOk == JS_TRUE)
    
{
        jss 
= JS_ValueToString (cx, rval);
        printf(
"The result is: %s", JS_GetStringBytes (jss));
    }

    
else
    
{
        printf(
"JS_EvaluateScript error!/n");
    }


    
//这里调用js的函数
    bOk = JS_CallFunctionName(cx, glob, "OnTest"0, NULL, &rval);


    
/*释放上下文*/
    JS_DestroyContext(cx);
    
/*释放RunTime*/
    JS_DestroyRuntime(rt);

    system(
"PAUSE");
    
return 0;
}

#include "jsapi.h" 这个文件就是我们需要从源代码中拿到的头文件,这里可以下载

test.js的代码

doit("wangweixing2000");   //这里调用c的函数

function OnTest()    //js的函数
{
    doit(
"OnTest");
}

运行的结果我们会看到打印出来的信息是:
wangweixing2000
OnTest

说明,你需要找到js3250.dll和nspr4.dll找到copy到你的目录,然后把js3250.dll改名为js32.dll
你需要把下载的js代码用vc编译一下会出来一个js.lib文件也copy你的项目中,
一切ok,还等什么试试!!

有了这个东东,我们的程序也就可以支持解析脚本了,:)!

js用得地方比较多我们用得vs的ide到处都用js写的,你最喜欢的向导都是通过html页面加js写的!!!

希望这篇文章能对你有用,好久没有来更新我的blog了!:),喜欢就多多支持哦!

抱歉!评论已关闭.