目的: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一样能达到想要的效果)
官方的文档中介绍的很清楚,包括我之前遇到的问题,发现官方文档中都提到了,本篇问题的解决,也是来源于官方的例子。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。