1

假设我是 AS3 和 FlasCC 的新手,并尝试将一些遗留 C++ 代码移植到 Flash。我所拥有的是一些数字运算例程,它需要一个类型double的数组(数组是固定大小的)。C ++原型是,比如说:

double doNumberCrunching(double input[512]);

现在我想构建一个 SWC,然后doNumberCrunching()从 AS3 调用。SWIG 将 AS3 接口生成为:

doNumberCrunching(var _input:*):Number;

但是,我不知道如何在Vector.<Number>(512)不处理原始字节的情况下提供它。

我的问题是:如何巧妙地解决它?你知道访问double*底层的廉价方法Vector.<Number>吗?或者更好的东西?

4

1 回答 1

0

如果只有您的数字运算功能在整数上运行!然后,您将能够使用CModule.writeIntVector将向量内容写入 DomainMemory 并传递指向 C++ 代码的指针。

但由于它是双精度数,您将不得不遍历 Vector 并使用CModule.writeDouble将每个元素从 AS3 Number 转换为 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);
  }
}
于 2013-03-13T05:33:35.163 回答