2012-12-12 43 views
0

我是使用Firebreath的新手。作为一个练习,我正在尝试编写一个插件来完成矢量添加。出于某种原因,我正在为此而挣扎。我会对我正在尝试做的事情做相关的代码。Firebreath NPAPI插件通过javascript数组传递

这是我的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,它只是打印输入...和不退出..我在这里错过了什么?谢谢

回答

2

首先你不应该使用.cast,你应该使用.convert_cast。如果你使用.cast,它只会在它实际上是一个可能或不可能是双倍的情况下才起作用。请记住,NPAPI不​​知道您正在使用的类型化数组/缓冲区。我的猜测是,你没有得到任何地方的原因是有一个FB :: variant :: bad_variant_cast异常被抛出(我认为是正确的异常类型;看在variant.h是肯定)在演员或可能你的GetProperty失败并抛出FB :: script_error。