JavaScriptCore console.log
我整理了一个非常简单的程序,它使用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); double res = JSValueToNumber(ctx,result,NULL); JSGlobalContextRelease(ctx); printf("%lfn",res); return 0; } 这里的想法是最后一个值应该是一个数字,并打印该值.这适用于有效的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"); 请注意,我已经尝试定义了一个vararg版本(记录了多个参数),但我无法在框架api中正常工作. 请注意,此解决方案使用随新的Objective-C API引入的功能,用于与IOS 7同时引入的JavaScriptCore.framework.如果您正在寻找Objective-C和Javascript之间这个良好集成的桥梁的介绍,请查看2013年WWDC在Apple开发者网络上推出的“将JavaScript集成到本机应用程序”会话: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"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |