JavaScriptCore 控制台.log

标签 javascript objective-c xcode macos core-foundation

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

#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 代码,例如

var square = function(x) { return x*x; }; square(4)

但是,如果代码尝试执行 console.log,则程序会出现段错误。 JSC 中是否有可用的日志功能,还是我必须自己动手?

最佳答案

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

这是一些对我有用的代码(抱歉,根据您上面的代码,它是 Objective-C 而不是标准 C):

JSContext *javascriptContext  = [[JSContext alloc] init];
javascriptContext[@"consoleLog"] = ^(NSString *message) {
    NSLog(@"Javascript log: %@",message);
};

然后通过以下方式从 Javascript 使用它:

consoleLog("My debug message");

请注意,我已尝试定义一个可变参数版本(日志采用多个参数),但我无法使其在整个框架 api 中正常工作。

请注意,此解决方案使用新的 Objective-C API 引入的功能,用于与 IOS 7 同时引入的 JavaScriptCore.framework。如果您正在寻找 Objective-C 和 Javascript 之间这个集成良好的桥梁的介绍, 查看 Apple 开发者网络上的 2013 WWDC 介绍“将 JavaScript 集成到 native 应用程序” session :https://developer.apple.com/videos/wwdc/2013/?id=615

更新回答:

对于那些想要在不重构的情况下最大限度地重用 javascript 代码的人,我已经设法让一个版本工作,它声明了 console.log() 形式的日志:

JSContext *javascriptContext  = [[JSContext alloc] init];
[javascriptContext evaluateScript:@"var console = {}"];
javascriptContext[@"console"][@"log"] = ^(NSString *message) {
    NSLog(@"Javascript log: %@",message);
};

然后通过以下方式从 Javascript 使用它:

console.log("My debug message");

关于JavaScriptCore 控制台.log,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19649932/

相关文章:

javascript - Fullpage.js 部分内的可滚动 div 不起作用

objective-c - 分割获取的结果 Controller 中断搜索显示

xcode - 类型 'String' 不确认协议(protocol) 'NSCopying' 与 NSDictionary

javascript - 多次按键对左侧和空格不起作用?

javascript - 使用 Javascript 更改 td 元素文本

ios - 在 iOS 应用程序中报告事件的最佳实践

ios - 拉动刷新不会分离(不会停止刷新)-Objective-C

C++运算符编译错误

ios - StackView 中的按钮不保持大小限制

javascript - Angular 合并几张图片