Я тоже немного застрял в этом. Это лучшее, что я придумал, это передать все необходимые вам байтовые массивы в функцию c. В моем случае я передаю один байтовый массив входных данных и передаю другой пустой byteArray для функции c, в которую помещаются выходные данные. Затем функции c не нужно создавать byteArray (я не смог заставить его работать), а функции c не нужно возвращать значение.
AS код:
public function actionscriptFunction() {
var myInputData:ByteArray = new ByteArray();
-- maybe load a file or something into myInputData
var myOutputData:ByteArray = new ByteArray();
var loader:CLibInit = new CLibInit();
var lib:Object = loader.init();
lib.readFile( myInputData, myOutputData );
-- do something with the output data
}
C код:
static AS3_Val readFile( void *self, AS3_Val args ) {
AS3_Val inData_arg = AS3_Undefined();
AS3_Val outData_arg = AS3_Undefined();
AS3_ArrayValue( args, "AS3ValType, AS3ValType", &inData_arg, &outData_arg );
AS3_Val inDataLength = AS3_GetS( inData_arg, "length" );
-- do something with input data, fill output data array
// try to stop it leaking
// AS3_ReleaseX( wavData_arg ); AS3_ReleaseX( dstData_arg ); AS3_ReleaseX( logFile_arg );
// AS3_ReleaseX( args );
return AS3_Null;
}
Однако, что бы я ни пытался, это приводит к утечке байтовых массивов, поэтому я думаю, что должен быть лучший способ.
** ОБНОВЛЕНИЕ
Я обнаружил, что он пропускает ByteArrays, только если я создаю новый CLibInit более одного раза. То есть, если использовать статический экземпляр и инициализировать его только тогда, когда все в порядке.
например,
static private var _myLibLoader = new CLibInit();
static private var _myLib = _myLibLoader.init();