封装as接口:
要想编写的c库as能调用,必须按照一定的格式封装。api参考这里。需要包含alchemy/avm2-libc/include/AS3.h文件。
1. 初始化库,在c的主程序的main函数中需要做如下初始化。
int main(int argc, char** argv) {
//新建一个as3对象
AS3_Val lib = AS3_Object("");
//将在as3中可以调用的c函数设置为上面新建的对象的方法(在as3中就是使用这个对象和方法)
AS3_Val fun = AS3_Function(NULL, p);
AS3_SetS(lib, "setMap", setMap);
AS3_Release(fun);
// notify that we initialized -- THIS DOES NOT RETURN!
AS3_LibInit( lib ); //这个函数不会返回,所以这个函数后面的任何代码都不会执行
return 0;
}
2. 函数参数和返回值
函数的参数和返回值只能是固定格式 ,如 AS3_Val setMap(void* data, AS3_Val args)。
data为包含客户端环境的数据,一般不使用。
args为一个as3数组,类似as3中的fun(data, ...args)形式。args就是用来接收从as3中传入的函数。可以用如下代码转换为c变量:
int mapWidth;
int mapHeight;
char *walkalbe;
int tileWidth;
int tileHeight;
//用来接收as3的ByteArray对象
unsigned int size;
AS3_Val btyArr;
//将as3的数组转换为c变量
AS3_ArrayValue(args, "IntType, IntType, AS3ValType, IntType, IntType", &mapWidth, &mapHeight, &btyArr, &tileWidth, &tileHeight);
walkalbe = mallocFromByteArray(btyArr, &size); //函数定义在下面
AS3_Release(btyArr);
/**
* 将as3的ByteArray对象转换为c的char数组
*/
char* mallocFromByteArray(AS3_Val byteArray, unsigned int* size) {
AS3_Val byteArraySize = AS3_GetS(byteArray, "length");
*size = AS3_IntValue(byteArraySize);
AS3_Release(byteArraySize);
char* bytes = (char*) malloc(*size);
AS3_SetS(byteArray, "position", AS3_Int(0));
AS3_ByteArray_readBytes(bytes, byteArray, (int)*size);
return bytes;
}
函数的返回值必须是AS3_Val,如果没有返回值可以返回AS3_True()。AS3_Val类型可以表示as3中的任何对象类型。
关于编译:
c用gcc,c++用g++。如果有多个文件需要分别编译(或写makefile),如下:
g++ -c BinHeap.cpp
g++ -c AStar.cpp
g++ -c PathFinder.cpp
g++ BinHeap.o AStar.o PathFinder.o -O3 -Wall -swc -o pathfinder.swc
另外,使用c++的标准库<cstdlib>,会使编译后的文件大许多(+200K),最好使用<stdlib.h> <stdio.h>。
评论