Firebreath NPAPI插件通过引用传递javascript数组

时间:2012-12-12 19:31:59

标签: npapi firebreath

我是使用Firebreath的新手。作为练习,我正在尝试编写一个插件来执行向量添加。出于某种原因,我正在努力解决这个问题。我将提供我正在尝试做的相关代码。

这是我的Javascript代码。

    var problemsize = 512 * 100 
var allocsize   = problemsize * 8

var bufferA = new ArrayBuffer(allocsize);
var bufferB = new ArrayBuffer(allocsize);
var bufferC = new ArrayBuffer(allocsize);
var N = problemsize

var float32ViewA = new Float32Array(bufferA);
var float32ViewB = new Float32Array(bufferB);
var float32ViewC = new Float32Array(bufferC);

for (var i = 0; i < problemsize; i++) {
    float32ViewA[i] = 4;
    float32ViewB[i] = 3;
    float32ViewC[i] = 0;
}

plugin().addvect(float32ViewA.buffer,float32ViewB.buffer,float32ViewC.buffer,problemsize);

我的插件API.cpp中的代码

void TestJSAPI::addvect(const FB::JSObjectPtr& A, const FB::JSObjectPtr& B, const  FB::JSObjectPtr& C, int N){

std::cout << "Entering TestJSAPI::addvect " << std::endl;


int i = 0;
for( i = 0 ; i < N ; i++){
    double val = A->GetProperty(i).cast<double>() + B->GetProperty(i).cast<double>();
    C->SetProperty(i,val);

}


std::cout << "Exiting TestJSAPI::addvect" << std::endl;

}

我似乎无法弄清楚出了什么问题。我从控制台启动firefox,它只是打印输入...而不是退出..我在这里缺少什么?感谢

1 个答案:

答案 0 :(得分:2)

首先你不应该使用.cast,你应该使用.convert_cast。如果你使用.cast,它只会在碰巧实际上是双倍的情况下才有效,可能是也可能不是。请记住,NPAPI对您正在使用的类型化数组/缓冲区一无所知。

我的猜测是你没有得到任何地方的原因是有一个FB :: variant :: bad_variant_cast异常被抛出(我认为这是正确的异常类型;请查看variant.h以确保)在演员表上或可能你的GetProperty失败并抛出FB :: script_error。