Skip to content
bang edited this page Jun 1, 2016 · 3 revisions

##API

所有的扩展都要继承 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: 转换。

##示例:添加C函数支持

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)
Clone this wiki locally