-
Notifications
You must be signed in to change notification settings - Fork 2.2k
创建扩展
bang edited this page Mar 29, 2017
·
4 revisions
所有的扩展都要继承 JPExtension
:
@interface JPExtension : NSObject
+ (void)main:(JSContext *)context;
//参数转换相关方法
+ (void *)formatPointerJSToOC:(JSValue *)val;
+ (id)formatPointerOCToJS:(void *)pointer;
+ (id)formatJSToOC:(JSValue *)val;
+ (id)formatOCToJS:(id)obj;
//struct相关方法
+ (int)sizeOfStructTypes:(NSString *)structTypes;
+ (void)getStructDataWidthDict:(void *)structData dict:(NSDictionary *)dict structDefine:(NSDictionary *)structDefine;
+ (NSDictionary *)getDictOfStruct:(void *)structData structDefine:(NSDictionary *)structDefine;
@end
JPExtension
只有一个主方法 +main:
需要实现,其他都是辅助方法。+main
方法会在使用 [JPEngine addExtensions:@['extensionName']
添加扩展时立刻执行,可以在这个方法里为 JS 添加函数。
formatXXX
的4个方法用于参数在 OC / JS 间转换,当把对象/指针返回给 JS 前,需要使用 -formatOCToJS:
/ -formatPointerOCToJS:
转换,当把对象/指针从 JS 传给 OC 时,使用前需要用 -formatJSToOC:
/ -formatPointerJSToOC:
转换。
JSPatch 可以通过 JPCFunction 扩展去调用 C 函数,也可以通过创建扩展逐个函数封装的方式让调用更高效。
@interface JPMemory : JPExtension
@end
@implementation JPMemory
+ (void)main:(JSContext *)context
{
context[@"malloc"] = ^id(size_t size) {
void *m = malloc(size);
return [self formatPointerOCToJS:m];
};
context[@"free"] = ^id(JSValue *jsVal) {
void *m = [self formatPointerJSToOC:jsVal];
free(m)
};
}
@end
现在我们可以在 JS 上使用 malloc()
和 free()
了:
require('JPEngine').addExtensions(['JPMemory'])
var m = malloc(1024)
free(m)