目的:as调用c的函数,传入一个数组参数,并且能获取到处理之后的数组。
void init() __attribute__((used,annotate("as3sig:public function init(arr: Array):Array"),
annotate("as3package:example")));
void init()
{
//
}参考:http://stackoverflow.com/questions/14326828/how-to-pass-bytearray-to-c-code-using-flascc
上面地址中,回答数量虽然不多,但每一个都很有用。
You should use CModule.malloc and CModule.writeBytes methods to manipulate with pointers in C-style manner. Take a look on $FLASCC/samples/06_SWIG/PassingData/PassData.as
看了看PassingData下面的例子,确实写的简洁清晰。基本够用了。
稍作修改,写了一个例子。
int sumGrid(int grid[3][3]){
int i, j;
int sum = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++){
sum += grid[i][j];
}
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++){
grid[i][j]+=1;
}
return sum;
}sumGrid是PassingData中的例子,我加了一个grid[i][j]+=1;
var row1:Array = [0,1,2];
var row2:Array = [3,4,5];
var row3:Array = [6,7,8];
var rows:Array = [row1, row2, row3];
var rowsLen:int = rows.length * row1.length;
var rowsPtr:int = CModule.malloc(4 * rowsLen);
for (var k:int = 0; k < rows.length; k++){
var row:Array = rows[k];
for (var kk:int = 0; kk < row.length; kk++){
var rowOffset:int = k * 4 * row.length;
var columnOffset:int = kk * 4;
CModule.write32(rowsPtr + rowOffset + columnOffset, row[kk]);
}
}
printLine("rowsPtr: " + rowsPtr);
printLine("2D Sum: " + sample.MyArray.sumGrid(rowsPtr));
printLine("rowsPtr: " + rowsPtr);
//上面是PassingData中的例子,下面是我加的。c中处理完数组之后,我们在as里边直接读取就行了。rowsPtr其实就是数组的地址(我不太懂指针地址,大概是这个意思)。
var outRow:Array=[];
for ( k = 0; k < 3; k++){
outRow[k]=[];
for (kk = 0; kk < 3; kk++){
rowOffset = k * 4 * 3;
columnOffset = kk * 4;
outRow[k][kk]= CModule.read32(rowsPtr + rowOffset + columnOffset);
}
printLine( outRow[k]);
}
CModule.free(rowsPtr);具体可以下载下面的源码来看。
samples\06_SWIG\PassingData中用到了SWIG,如果这么用的话,还得学习一下SWIG,SWIG到底是什么,我也不知道,需要学的东西太多了。(不用SWIG一样能达到想要的效果)
官方的文档中介绍的很清楚,包括我之前遇到的问题,发现官方文档中都提到了,本篇问题的解决,也是来源于官方的例子。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。