首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScriptCore console.log

JavaScriptCore console.log
EN

Stack Overflow用户
提问于 2013-10-29 04:53:47
回答 5查看 7.1K关注 0票数 27

我编写了一个非常简单的程序,使用JavaScriptCore来评估JS:

代码语言:javascript
复制
#import <CoreFoundation/CoreFoundation.h>
#import <JavaScriptCore/JavaScriptCore.h>

int main(int argc, const char * argv[])
{
    JSGlobalContextRef ctx = JSGlobalContextCreate(NULL);

    FILE *f = fopen(argv[1],"r");
    char * buffer = malloc(10000000);
    fread(buffer,1,10000000,f);

    CFStringRef strs = CFStringCreateWithCString(NULL, buffer, kCFStringEncodingASCII);

    JSStringRef jsstr = JSStringCreateWithCFString(strs);
    JSValueRef result = JSEvaluateScript(ctx, jsstr, NULL, NULL, 0, NULL);

    double res  = JSValueToNumber(ctx, result, NULL);
    JSGlobalContextRelease(ctx);

    printf("%lf\n", res);
    return 0;
}

这里的想法是,最后一个值应该是一个Number,并且这个值是打印出来的。这适用于有效的javascript代码,如

代码语言:javascript
复制
var square = function(x) { return x*x; }; square(4)

但是,如果代码试图执行console.log,程序就会出现分段错误。JSC中是否有可用的日志函数,还是必须自己滚动?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-01-24 05:39:49

如果使用来自Mac或IOS的JavaScriptCore框架,则必须提供自己的控制台日志。

下面是一些对我有用的代码(抱歉,它是Objective,而不是上面代码中的标准C):

代码语言:javascript
复制
JSContext *javascriptContext  = [[JSContext alloc] init];
javascriptContext[@"consoleLog"] = ^(NSString *message) {
    NSLog(@"Javascript log: %@",message);
};

然后通过以下方式使用Javascript中的

代码语言:javascript
复制
consoleLog("My debug message");

请注意,我尝试过定义vararg版本(日志使用多个参数),但无法在框架api中正确工作。

请注意,该解决方案使用了新的Objective为JavaScriptCore.framework引入的特性,同时引入了IOS 7。如果您正在寻找目标C和Javascript之间这一集成良好的桥梁的介绍,请参阅2013年在苹果开发者网络上的“将JavaScript集成到本地应用程序”会话:https://developer.apple.com/videos/wwdc/2013/?id=615

最新答复:

对于那些希望在不进行重构的情况下最大限度地重用javascript代码的人,我设法使声明表单console.log()的日志的版本正常工作:

代码语言:javascript
复制
JSContext *javascriptContext  = [[JSContext alloc] init];
[javascriptContext evaluateScript:@"var console = {}"];
javascriptContext[@"console"][@"log"] = ^(NSString *message) {
    NSLog(@"Javascript log: %@",message);
};

然后通过以下方式使用Javascript中的

代码语言:javascript
复制
console.log("My debug message");
票数 24
EN

Stack Overflow用户

发布于 2016-03-08 21:06:04

Swift 3.0

代码语言:javascript
复制
let javascriptContext = JSContext()
javascriptContext?.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }")
let consoleLog: @convention(block) (String) -> Void = { message in
    print("console.log: " + message)
}
javascriptContext?.setObject(unsafeBitCast(consoleLog, to: AnyObject.self), forKeyedSubscript: "_consoleLog" as (NSCopying & NSObjectProtocol)!)

Swift 2.1

代码语言:javascript
复制
let javascriptContext = JSContext()
javascriptContext.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }")
let consoleLog: @convention(block) String -> Void = { message in
    print("console.log: " + message)
}
javascriptContext.setObject(unsafeBitCast(consoleLog, AnyObject.self), forKeyedSubscript: "_consoleLog")

然后通过以下方式使用Javascript中的

代码语言:javascript
复制
console.log("My debug message");
票数 20
EN

Stack Overflow用户

发布于 2017-08-03 18:48:00

代码语言:javascript
复制
self.jsContext = JSContext()
self.jsContext.evaluateScript(...)       
let logFunction: @convention(block) (String) -> Void  = { (string: String) in
    print(string)
}

self.jsContext.setObject(logFunction, forKeyedSubscript: "consoleLog" as NSCopying & NSObjectProtocol)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19649932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档