0

当我调用 NPN_GetValue 时,我的插件代码崩溃。基本上,我创建了一个可编写脚本的对象,它有一个“getDevice”方法,可以将设备数组返回给 JavaScript。下面是代码片段。

static bool mainNPObjectInvoke(NPObject *obj, NPIdentifier identifier, const NPVariant *args, uint32_t argCount, NPVariant *result)
{
    printf("create main object");
    MainNPObject *mainObject = (MainNPObject *)obj;

    if (identifier == methodIdentifiers[METHOD_ID_GET_DEVICES])
    {
        NPObject *windowObj = NULL;
        browser->getvalue(mainObject->npp, NPNVWindowNPObject, &windowObj);
        // it crashed here
    ....
    }
}

我用下面的方法创建了 MainNPObject 实例。

NPObject *createMainNPObject(NPP npp)
{
    MainNPObject *object = (MainNPObject *)browser->createobject(npp, &mainNPClass);
    object->npp = npp;

    theMainObject = object;

    return (NPObject *)object;
}

createMainNPObject 在我提供给浏览器的插件函数中被调用。

NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value)
{
    PluginObject *obj = instance->pdata;

    switch (variable) {
        case NPPVpluginCoreAnimationLayer:
            if (!obj->rootLayer)
                setupLayerHierarchy(obj);

            *(CALayer **)value = obj->rootLayer;

            return NPERR_NO_ERROR;

        case NPPVpluginScriptableNPObject:

            if (!obj->mainObject)
            {
                obj->mainObject = createMainNPObject(instance);
            }
 ....
}

分配功能如下。

static NPObject *mainNPObjectAllocate(NPP npp, NPClass *class)
{
    initializeIdentifiers();

    MainNPObject *mainObject = malloc(sizeof(MainNPObject));
    mainObject->deviceManager = [[DeviceManager alloc] init];

    return (NPObject *)mainObject;
}

MainNPObject 的定义:

typedef struct
{
    NPObject *npobject;
    NPP npp;
    DeviceManager *deviceManager;
} MainNPObject;

通过调试代码,发现系统在调用browser->getValue时抛出了EXC_BAD_ACCESS,看起来npp指针无效。

0x00007fff83f82dab  <+0019>  je     0x7fff83f82db9 <_ZN6WebKit14NetscapePlugin7fromNPPEP4_NPP+33>
0x00007fff83f82dad  <+0021>  incl   0x8(%rax)

有人可以帮我吗?

谢谢!

4

1 回答 1

0

唔; 没有看到任何明显的东西。尝试向您的结构添加另一个参数(一个 int?)并在分配期间或紧随其后设置它,然后稍后检查它是否仍然是您在调用 getvalue 之前设置的值。查看您的结构是否以某种方式损坏。当我以一种不明显的方式使 NPObject 变得有趣时,这发生在我身上一次。

于 2012-05-05T05:25:42.380 回答