Javascript 如何在iOS应用程序中使用iMonkey

Javascript 如何在iOS应用程序中使用iMonkey,javascript,objective-c,ios,Javascript,Objective C,Ios,看起来是在iOS应用程序中嵌入JS运行时的一种有趣方式,但我找不到任何关于如何实际运行某些JS代码的示例 我可以构建/链接lib,包括jsapi.h头(来自src目录),但当我尝试从spider monkey(见下文)获得的一些示例代码时,它会遇到各种链接器错误(“未定义的架构符号…”)。要明确的是,这几乎是另一个网站上与Mac相关的帖子的复制粘贴,我根本不确定这是否应该这样做。我确信我有适合我的架构(模拟器)的静态库(通用) 有人知道怎么做吗 #include "jsapi.h" .....

看起来是在iOS应用程序中嵌入JS运行时的一种有趣方式,但我找不到任何关于如何实际运行某些JS代码的示例

我可以构建/链接lib,包括jsapi.h头(来自src目录),但当我尝试从spider monkey(见下文)获得的一些示例代码时,它会遇到各种链接器错误(“未定义的架构符号…”)。要明确的是,这几乎是另一个网站上与Mac相关的帖子的复制粘贴,我根本不确定这是否应该这样做。我确信我有适合我的架构(模拟器)的静态库(通用)

有人知道怎么做吗

#include "jsapi.h"

.....

JSRuntime *rt;
JSContext *cx;
JSObject  *global;

/* Create a JS runtime. */
rt = JS_NewRuntime(8L * 1024L * 1024L);

/* Create a context. */
cx = JS_NewContext(rt, 8192);
JS_SetOptions(cx, JSOPTION_VAROBJFIX);

/* Create the global object. */
global = JS_NewObject(cx, &global_class, NULL, NULL);

/* Populate the global object with the standard globals,
 like Object and Array. */
if (!JS_InitStandardClasses(cx, global))
    @throw [[NSException alloc]initWithName:@"JSerror" reason:@"jserrpr" userInfo:nil];

/* Cleanup. */
JS_DestroyContext(cx);
JS_DestroyRuntime(rt);
JS_ShutDown();

下面是一个松散地基于原始蜘蛛猴中发现的示例的示例

我对其进行了修改,使其能够与多线程一起工作(iMonkey已经启用了多线程)

//
//JSEngine.mm
//POC_JS
//
//由Quoc Le于2012年7月12日创建。
//版权所有(c)2012年\uuuu MyCompanyName\uuuuu。版权所有。
//
#导入“JSEngine.h”
/*获取SpiderMonkey API声明*/
#包括
/*退出失败和退出成功*/
#包括
/*斯特伦*/
#包括
@实现JSEngine
+(int)运行
{
/*指向运行时对象的指针*/
JSRuntime*runtime=NULL;
/*指向上下文的指针*/
JSContext*context=NULL;
/*指向全局JavaScript对象的指针*/
JSObject*global=NULL;
/*要运行的脚本(应返回100)*/
char*script=“var x=10;x*x;”;
/*用于存储脚本结果的JavaScript值*/
jsval-rval;
/*创建新运行时、新上下文、全局对象*/
如果((!(runtime=JS_NewRuntime(1024L*1024L)))
||(!(context=JS_NewContext(运行时,8192)))
)返回退出失败;
JS_SetContextThread(上下文);
JS_BeginRequest(上下文);
//| |(!(global=JS_NewObject(context,NULL,NULL,NULL)))
global=JS_NewObject(上下文,NULL,NULL,NULL);
/*设置上下文的全局对象并初始化标准ECMAScript
此全局对象范围内的对象(数学、日期等)*/
如果(!JS_InitStandardClasses(context,global))返回EXIT_失败;
/*现在我们已经准备好运行脚本了*/
如果(!JS_EvaluateScript(上下文、全局、脚本、strlen(脚本),
“脚本”、1和rval)
返回退出失败;
/*检查结果是否为100*/
NSLog(@“RSVAL%d”,JSVAL_TO_INT(rval));
如果(!(JSVAL_是INT(rval)&(JSVAL_到INT(rval)==100)))
返回退出失败;
JS_EndRequest(上下文);
JS_ClearContextThread(上下文);
/*清理*/
//JS_销毁上下文(上下文);
//JS_运行时(runtime);
//JS_ShutDown();
返回退出成功;
}
@结束

我的链接器也有类似的问题。只需将libstdc++6添加到项目中即可避免此问题

//
//  JSEngine.mm
//  POC_JS
//
//  Created by Quoc Le on 7/12/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "JSEngine.h"

/* get SpiderMonkey API declarations */
#include <jsapi.h>
/* EXIT_FAILURE and EXIT_SUCCESS */
#include <stdlib.h>  
/* strlen */
#include <string.h>


@implementation JSEngine

+ (int) run
{
    /* pointer to our runtime object */
    JSRuntime *runtime=NULL;
    /* pointer to our context */
    JSContext *context=NULL;
    /* pointer to our global JavaScript object */
    JSObject  *global=NULL;

    /* script to run (should return 100) */
    char *script="var x=10;x*x;";
    /* JavaScript value to store the result of the script */
    jsval rval;

    /* create new runtime, new context, global object */
    if (    (!(runtime = JS_NewRuntime (1024L*1024L)))
        || (!(context = JS_NewContext (runtime, 8192)))
        ) return EXIT_FAILURE;

    JS_SetContextThread(context);
    JS_BeginRequest(context);

    //        || (!(global  = JS_NewObject  (context, NULL, NULL, NULL)))

    global  = JS_NewObject  (context, NULL, NULL, NULL);

    /* set global object of context and initialize standard ECMAScript
     objects (Math, Date, ...) within this global object scope */
    if (!JS_InitStandardClasses(context, global)) return EXIT_FAILURE;

    /* now we are ready to run our script */
    if (!JS_EvaluateScript(context, global,script, strlen(script),
                           "script", 1, &rval))
        return EXIT_FAILURE;
    /* check if the result is really 100 */
    NSLog(@"RSVAL %d", JSVAL_TO_INT(rval));
    if (!(JSVAL_IS_INT(rval)&&(JSVAL_TO_INT(rval)==100)))
        return EXIT_FAILURE;

    JS_EndRequest(context);
    JS_ClearContextThread(context);

    /* clean up */
    //JS_DestroyContext(context);
    //JS_DestroyRuntime(runtime);
    //JS_ShutDown();
    return EXIT_SUCCESS;
}

@end