20
2015
07

flascc:使用SWIG创建swc

文章来源:http://www.csdn123.com/html/blogs/20130509/11076.htm

同时,结合samples\06_SWIG\PassingData来学习。

使用SWIG创建swc之二(C++类的调用)

返回脚本百事通

同学们下午好, 在前一篇教程中我们已经了解了基本的SWIG创建SWC的过程, 今天我捣鼓了大半天研究了如何调用C++的类, 接下来说说过程吧.


首先编写C++类, 分别是example.h和example.cpp, 如下:

/**example.h*/
class TestCC
{
	public:
		TestCC(double, double);
		
		double x, y;
		
		virtual double add(void);
		virtual void set(double, double);
		void copyTo(TestCC*);
};


#include "example.h"

/**example.cpp*/
TestCC::TestCC(double v1, double v2)
{
	x = v1;
	y = v2;
}

void TestCC::copyTo(TestCC* t)
{
	t->x = x;
	t->y = y;
}

double TestCC::add(void)
{
	return x+y;
}

void TestCC::set(double v1, double v2)
{
	x = v1;
	y = v2;
}

代码很简单, 相信不需要怎么说明了吧.


接下来就是打包了. 我们需要改一下swig的接口文件, 就像下面那样:

#ifdef SWIG
%module AddExample

%{
#include "example.h"
%}

%include "example.h"

#else
#include "example.h"
#endif


相应的MakeFile文件也做相应的修改:

all: check
	@echo "-------- PassingData --------"
	@echo "-> Generate SWIG wrappers around the functions in the library"
	"$(FLASCC)/usr/bin/swig" -c++ -as3 -module AddExample -outdir . -ignoremissing -o AddExample_wrapper.cpp example.i
	
	@echo "-> Compile the SWIG wrapper to ABC"
	$(AS3COMPILERARGS) -abcfuture -AS3 -import $(call nativepath,$(FLASCC)/usr/lib/builtin.abc) -import $(call nativepath,$(FLASCC)/usr/lib/playerglobal.abc) AddExample.as
	
	@echo "-> Compile the library into a SWC"
	"$(FLASCC)/usr/bin/g++" $(BASE_CFLAGS) AddExample.abc AddExample_wrapper.cpp example.cpp main.cpp -emit-swc=sample.add -o add.swc

include ../Makefile.common

clean:
	rm -f *_wrapper.c *.swc *.as *.abc

修改了什么地方呢只是在第4行加了一个"-c++"而已啦, 不加的话会报一个“Warning 301: class keyword used, but not in C++ mode”的错误, 所以同学们加上吧.


接下来执行make命令吧, 看看是不是生成了add.swc文件了呢


最后还是在AS中进行测试:

package
{
	import flash.display.Sprite;
	
	import sample.add.CModule;
	
	public class UnitTest extends Sprite
	{
		public function UnitTest()
		{
			CModule.startAsync(this);
			var a:TestCC = TestCC.create(10, 10);
			trace(a.add());
			a.set(20, 20);
			trace(a.add());

			var t:TestCC = TestCC.create(10, 10);
			t.copyTo(a.swigCPtr);
			trace(a.add());
		}
	}
}

猜猜输出是什么是的, 如你们所预期的! 实验成功

20
40
20

总结一下:

我们只需要写好.h和.cpp文件,.i文件里边include了.h文件,修改Makefile文件,然后生成。其他文件都是自动生成的。

生成swc之后,就可以在as中使用了,自动生成的AddExample.as文件(本例中是这个名字),提供了swc中类及方法的实现。不知道swc中有哪些方法,可以看这个类。

本例中,函数的参数都是简单类型,如果我们想传一些复杂类型,该怎么办?

我试着用c++写了一个复数的类,实现了一些运算。发现,可以用指针来作为参数,或者返回值,使用起来很方便,因为生成swc中,c++生成的类中会有swigCPtr参数,这个参数,就是c++中该类的指针。直接用c++中定义的类来作为参数或者返回值,会有问题,到目前为止,我还不知道怎么使用。


源码打包下载(使用SWIG创建swc)

源码打包下载(使用SWIG创建swc-复数类)

« 上一篇下一篇 »

相关文章:

c语言保存bmp、png图片  (2018-10-10 16:33:42)

曲线拟合、平滑  (2016-4-27 9:13:10)

c语言学习网站收藏  (2016-4-22 7:35:19)

把C++当脚本语言写(转)  (2016-2-24 9:41:35)

flascc:as与c相互传递数组  (2015-7-16 18:15:24)

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

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

air for desktop结合c++开发  (2015-3-4 16:11:1)

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

发表评论:

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