Flash调用C函数
研究了一下Flash如何使用C/C++语言的代码。第一步:首先能创建swf文件
从Adobe网站下载Flex SDK,编写一个as文件,编译一下就生成了一个swf,类似于C程序开发。
编辑文件:box.as
package{ import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldType; public class box extends Sprite{ public function box() { var label1:TextField = new TextField(); label1.text = "hello"; this.addChild(label1); } }}
编译:
./flex-sdk/bin/mxmlc box.as
会得到box.swf
第二步:下载alchemy SDK并配置开发环境
下载SDK包 http://download.macromedia.com/pub/labs/alchemy/alchemy_sdk_ubuntu_p1_121008.zip
解压后执行./config会生成alchemy-setup脚本
编辑alchemy-setup脚本,找到ADL变量声明,去掉注释,并修改为实际的adl路径,也就是$FLEX_SDK/bin/adl
创建一个环境设置脚本env.sh
source alchemy路径/alchemy-setupexport PATH=$ALCHEMY_HOME/achacks:flexSDK路径/bin:$PATH
执行source env.sh,则环境变量被设置好了。
此时gcc,g++都变成了使用achacks目录中的命令了,不是原来系统自带的gcc,g++。
第三步:Hello world
3.1编写C代码hello.c:提供一个函数,当调用此函数时在传入字符串的前面增加一些内容。
C接口参考:http://labs.adobe.com/wiki/index.php/Alchemy:Documentation:Developing_with_Alchemy:C_API
#include <stdlib.h>#include <stdio.h>#include <string.h>#include "AS3.h"static AS3_Val hello(void* self, AS3_Val args){ char hello = "hello,"; char* val = NULL; AS3_ArrayValue( args, "StrType", &val ); if(val != NULL) { strcat(hello, val); } return AS3_String(hello); //hello是局部变量也可以,因为此处新生成了对象}static AS3_Val wow(void*self, AS3_Val args) { return AS3_String("wow");}//entry point for codeint main(){ AS3_Val helloMethod = AS3_Function( NULL, hello); //函数名hello AS3_Val wowMethod = AS3_Function( NULL, wow); //函数名wow //保存接口列表,此处的成员类型为AS3ValType,成员名称可以和函数名不一样, //只要在As脚本中使用的名字和此处一直即可,不过推荐使用一致的名称。 AS3_Val result = AS3_Object( "hello:AS3ValType, wow:AS3ValType", helloMethod, wowMethod ); // Release。在result中还有引用,不会被真正释放。 AS3_Release( wowMethod); AS3_Release( helloMethod ); // notify that we initialized -- THIS DOES NOT RETURN! AS3_LibInit( result ); // should never get here! return 0;}
hello和wow两个函数是供As脚本调用的函数接口,在main函数中通过两个方法对象注册后As脚本就可以调用了。
gcc hello.c -swc -o hello.swc
输出文件名会影响包名,此处输出文件名为hello.swc,那么As中import的包名就是:
cmodule.hello.CLibInit,如果输出为h.swc,那么相应的就变成cmodule.h.CLibInit
3.2编写AS代码hello.as
AS接口参考:http://labs.adobe.com/wiki/index.php/Alchemy:Documentation:Developing_with_Alchemy:AS3_API
package{ import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldType; //引用包 import cmodule.hello.CLibInit public class hello extends Sprite{ public function hello() { var label1:TextField = new TextField(); label1.x = 100; label1.y = 100; this.addChild(label1); var label2:TextField = new TextField(); label2.x = 100; label2.y = 140; this.addChild(label2); //初始化库 var loader:CLibInit = new CLibInit(); var lib:Object = loader.init(); //通过函数绑定的对象名称调用函数 label1.text = lib.hello("boy"); label2.text = lib.wow(); } }}
编译生成swf
mxmlc -library-path+=./hello.swc -static-link-runtime-shared-libraries=true hello.as
最后得到hello.swf
在浏览器中或者用flashplayer就可以看到效果了,开始在Linux下屏幕是空白的,是因为第三方插件对flash支持的不是太好。
到 http://www.adobe.com/support/flashplayer/downloads.html 下载个Flash Player 10.3 Projector ,直接用flashplayer播放就看到效果了。
如果C代码中有内嵌汇编是编译不过的,从编译过程上分析:
C代码-->llvm中间码-->汇编代码(.s)-->二进制汇编(.o)-->链接成程序,如果有内嵌的汇编代码,那么llvm文档中有讲中间码中只会简单包含内嵌汇编代码,在下一步处理中直接会变成.s,而alchemy应该是只能支持到llvm中间码,不能支持.s的,如果llvm中包含有.s代码,那么就不能运行了。
页:
[1]