16
2015
07

flascc:as与c相互传递数组

目的: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一样能达到想要的效果)

官方的文档中介绍的很清楚,包括我之前遇到的问题,发现官方文档中都提到了,本篇问题的解决,也是来源于官方的例子。


源码打包下载

« 上一篇下一篇 »

相关文章:

flascc:使用SWIG创建swc  (2015-7-20 14:28:51)

flascc问题:c函数如何直接访问Array  (2015-7-15 18:19:40)

使用flascc生成的swc  (2015-7-15 18:12:3)

flasCC  (2015-2-5 14:18:31)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。