假设我刚接触AS3和FlasCC,并尝试将一些遗留的C++代码移植到闪存中。我拥有的是一些处理数字的例程,它接受一个double类型的数组(数组的大小是固定的)。例如,C++原型是:
double doNumberCrunching(double input[512]);现在,我想构建一个SWC,然后从AS3调用doNumberCrunching()。SWIG将AS3界面生成为:
doNumberCrunching(var _input:*):Number;但是,我不知道如何在不处理原始字节的情况下为它提供Vector.<Number>(512)。
我的问题是:如何巧妙地解决它?你知道一种廉价的方式来访问Vector.<Number>底层的double*吗?或者更好的东西?
发布于 2013-03-13 13:33:35
如果你的数字运算函数是在整型数上运行的话!然后,您就可以使用CModule.writeIntVector将矢量内容写入DomainMemory,只需传递指向C++代码的指针即可。
但是因为它是双精度的,所以你必须遍历向量,并使用CModule.writeDouble将每个元素从AS3数字转换为C++双精度。然后,您可以通过一个接受DomainMemory指针的接口将您的函数手动公开给AS3:
void doNumberCrunchingAS() __attribute__((used,
annotate("as3sig:public function doNumberCrunching(inputPtr:int):Number"),
annotate("as3package:mypackage"))
));
double doNumberCrunching( double* input )
{
// Actual implementation here
return 0;
}
void doNumberCrunchingAS()
{
// Read the AS3 argument and convert it to a convenient C++ form.
int memoryOffset = 0;
AS3_GetScalarFromVar(memoryOffset, inputPtr);
double* inputPtr = reinterpret_cast<double*>( memoryOffset );
// Call an implementation routine.
double result = doNumberCrunching( inputPtr );
// Return result to AS3 code.
AS3_Return( result );
}AS3代码:
package
{
using mypackage.doNumberCrunching;
function testNumberCrunching():void
{
var ptr:int = CModule.malloc(blobSize);
// a loop of writeDouble should be here
doNumberCrunching(ptr);
CModule.free(ptr);
}
}https://stackoverflow.com/questions/14879502
复制相似问题