使用JavaScript for Automation

时间:2018-03-13 18:44:38

标签: objective-c jxa

通过在JXA中使用ObjC.bindFunction,我们可以从objc_getClassList获得整数结果。

是否有人能够很好地理解类型和桥接问题,以找到获取objc_getClassList返回到JavaScript for Automation JSContext的类名字符串列表的路径?

(以下代码仅返回[Object Ref]字符串)

(() => {
    'use strict';

    ObjC.import('stdlib');


    ObjC.bindFunction('CFMakeCollectable', [ 'id', [ 'void *' ] ]);

    ObjC.bindFunction('objc_getClassList', ['int', ['void *', 'int']]);

    var classes = Ref();

    const intClasses = $.objc_getClassList(null, 0);

    $.objc_getClassList(classes, intClasses);

    $.CFMakeCollectable(classes);

    return [intClasses, classes];

    //-> [11411, [object Ref]]

})();

1 个答案:

答案 0 :(得分:1)

objc_getClassList函数期望我们为它提供一个内存缓冲区来复制类列表。通常,JXA会将malloc的返回类型视为无符号字符的C数组,但是使用bindFunction我们可以将malloc的返回类型转换为C指针数组,并使objc_getClassList的第一个参数匹配那种类型。然后,只需将索引编入缓冲区(类型为Ref)并将该值传递给class_getName

ObjC.bindFunction('objc_getClassList', ['int', ['void**', 'int']])
ObjC.bindFunction('malloc', ['void**', ['int']])
ObjC.bindFunction('class_getName', ['char *', ['void*']])

const numClasses = $.objc_getClassList(undefined, 0)
const classes = $.malloc(8*numClasses)
$.objc_getClassList(classes, numClasses)
for (i=0; i<numClasses; i++) {
  console.log("classes[" + i + "]: " + $.class_getName(classes[i]))
}