Flash调用C函数

研究了一下Flash如何使用C/C++语言的代码。

[b][size=large]第一步:首先能创建swf文件[/size][/b]
从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

[b][size=large]第二步:下载alchemy SDK并配置开发环境[/size][/b]
下载SDK包 [url]http://download.macromedia.com/pub/labs/alchemy/alchemy_sdk_ubuntu_p1_121008.zip[/url]
解压后执行./config会生成alchemy-setup脚本
编辑alchemy-setup脚本,找到ADL变量声明,去掉注释,并修改为实际的adl路径,也就是$FLEX_SDK/bin/adl
创建一个环境设置脚本env.sh

source alchemy路径/alchemy-setup
export PATH=$ALCHEMY_HOME/achacks:flexSDK路径/bin:$PATH

执行source env.sh,则环境变量被设置好了。
此时gcc,g++都变成了使用achacks目录中的命令了,不是原来系统自带的gcc,g++。

[b][size=large]第三步:Hello world[/size][/b]
3.1编写C代码hello.c:提供一个函数,当调用此函数时在传入字符串的前面增加一些内容。
C接口参考:[url]http://labs.adobe.com/wiki/index.php/Alchemy:Documentation:Developing_with_Alchemy:C_API[/url]

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "AS3.h"

static AS3_Val hello(void* self, AS3_Val args)
{
char hello[256] = "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 code
int 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接口参考:[url]http://labs.adobe.com/wiki/index.php/Alchemy:Documentation:Developing_with_Alchemy:AS3_API[/url]

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支持的不是太好。
到 [url]http://www.adobe.com/support/flashplayer/downloads.html[/url] 下载个Flash Player 10.3 Projector ,直接用flashplayer播放就看到效果了。


如果C代码中有内嵌汇编是编译不过的,从编译过程上分析:
C代码-->llvm中间码-->汇编代码(.s)-->二进制汇编(.o)-->链接成程序,如果有内嵌的汇编代码,那么llvm文档中有讲中间码中只会简单包含内嵌汇编代码,在下一步处理中直接会变成.s,而alchemy应该是只能支持到llvm中间码,不能支持.s的,如果llvm中包含有.s代码,那么就不能运行了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值