Tom Krcha's FlashRealtime

Hey amigo!
I am Tom Krcha, Gaming Evangelist at Adobe. These are my notes


HOWTO: Transfer Array and Vector from AS3 to C with AIR Native Extensions for iOS

February 8th, 2012

Last time I wrote about casting basic types from AS3 to C like Number, String, Boolean, int and uint. Now I’d like to cover two more complex types: Array and Vector.<Type>.

Array cast (AS3->C->AS3) reverse function

In this little sample, we will implement reverse function, that basically gets array like [1,2,3] and returns [3,2,1].

AS3 part:

public function reverseArray(array:Array):Array{
	var ret:Array= context.call("reverseArray",array) as Array;
	return ret;
}

C part:

This function consist of few steps, first get an array from argument, find length, create new AS3 Array instance in C, loop through original array + fill new array and return it.

FREObject reverseArray(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){
    FREObject arr = argv[0]; // array
    uint32_t arr_len; // array length
 
    FREGetArrayLength(arr, &arr_len);
 
    FREObject populatedArray = NULL;
    // Create a new AS3 Array, pass 0 arguments to the constructor (and no arguments values = NULL)
    FRENewObject((const uint8_t*)"Array", 0, NULL, &populatedArray, nil);
 
    FRESetArrayLength(populatedArray, arr_len);
 
    NSLog(@"Going through the array: %d",arr_len);
 
    int32_t j = 0;
    for(int32_t i=arr_len-1; i>=0;i--){
 
        // get an element at index
        FREObject element;
        FREGetArrayElementAt(arr, i, &element);
 
        // OPTIONAL: get an int value out of the element
        int32_t value;
        FREGetObjectAsInt32(element, &value);
 
        // log index and value
        NSLog(@"Get item %d: %d",i,value);
 
        NSLog(@"Set item %d: %d",j,value);
        FRESetArrayElementAt(populatedArray, j, element);
        j++;
    }
 
    return populatedArray;
}

Vector.<Type> (AS3->C->AS3) reverse function

Same thing applies for Vector.<Type>, the only difference is that the creation of the Vector.<Type> will look like this:

FRENewObject((const uint8_t*)"Vector.<int>", 0, NULL, &populatedArray, nil);

The implementation will look like this:

public function reverseVector(vector:Vector.<int>):Vector.<int>{
	var ret:Vector.<int>= context.call("reverseVector",vector) as Vector.<int>;
	return ret;
}
FREObject reverseVector(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){
 
    FREObject arr = argv[0]; // array
    uint32_t arr_len; // array length
 
    FREGetArrayLength(arr, &arr_len);
 
    FREObject populatedVector = NULL;
    // Create a new AS3 Array, pass 0 arguments to the constructor (and no arguments values = NULL)
    FRENewObject((const uint8_t*)"Vector.<int>", 0, NULL, &populatedVector, nil);
 
    FRESetArrayLength(populatedVector, arr_len);
 
    NSLog(@"Going through the vector: %d",arr_len);
 
    int32_t j = 0;
    for(int32_t i=arr_len-1; i>=0;i--){
 
        // get an element at index
        FREObject element;
        FREGetArrayElementAt(arr, i, &element);
 
        // OPTIONAL: get an int value out of the element
        int32_t value;
        FREGetObjectAsInt32(element, &value);
 
        // log index and value
        NSLog(@"Get item %d: %d",i,value);
 
        NSLog(@"Set item %d: %d",j,value);
        FRESetArrayElementAt(populatedVector, j, element);
        j++;
    }
 
    return populatedVector;   
}

Complete C implementation: IOSExtension.m
Complete AS3 implementation: IOSExtension.as

Facebook comments:

4 Comments »

No comments yet.

RSS feed for comments on this post. / TrackBack URL

Leave a comment

Comment moderation is enabled. Your comment may take some time to appear.