研究了一下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-setup
export 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[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接口参考:
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代码,那么就不能运行了。
分享到:
相关推荐
为了解决这一教学难题,李彩玲在《基于Flash的C语言函数算法实现.pdf》一文中提出了将Flash技术应用于C语言函数递归调用的教学当中。Flash是由Adobe公司开发的广泛应用于制作二维动画的软件,它具有文件体积小、携带...
在文章中,作者详细介绍了C语言函数递归概念的实现过程,包括递归的定义、递归算法的实现过程和栈结构的使用。然后,作者介绍了Flash动画的特点,包括矢量图形和流式播放技术、强大的影片剪辑特征和ActionScript的...
当涉及到函数指针时,AVR-GCC提供了将函数指针存储到Flash中的能力,并能够从Flash中正确调用这些函数指针。本文将详细介绍如何在AVR-GCC环境下使用函数指针指向Flash中的函数,并调用它们。 首先,需要了解的是,...
这个压缩包里面有两个文件:SPI_Flash.c 、SPI_Flash.h 。包括MSP430F149利用硬件SPI口读写串行Flash M25P64要调用的函数,在程序中有详细的说明,经本人调试,程序稳定可靠,大家放心下载
总结来说,C语言通过动态加载DLL实现调用JLink功能,主要涉及`LoadLibrary`、`GetProcAddress`和`FreeLibrary`这三个Windows API函数,以及理解和使用JLinkDLL的接口。这个过程对于嵌入式开发人员来说非常实用,因为...
在Flash编程中,调用外部数据,特别是数组,是一个常用且重要的技巧。这使得我们可以将数据存储在外部文件中,从而提高程序的可维护性和灵活性。在这个文档中,我们将探讨如何在Flash中加载和处理从外部文件导入的...
- **异步模式**:在异步模式中,调用C函数不会阻塞Flex应用,而是通过监听NativeProcess的事件(如`outputEvent`和`exitEvent`)来处理结果。这种方法适合长时间运行的任务,以避免冻结用户界面。 4. **编写C代码*...
`Eeprom.c`通常是实现函数的具体代码,包括读取、写入和擦除FLASH的函数,而`Eeprom.h`则可能包含了函数声明和相关的常量定义,供其他模块调用。 在`Eeprom.c`中,我们可能会看到以下关键步骤: 1. **初始化**:...
- **函数使用**:如何定义、调用函数,参数传递,以及递归函数的理解。 - **字符串处理**:使用字符串函数如strcpy、strcat、strcmp等进行字符串的操作和比较。 - **文件操作**:学习如何打开、读取、写入和关闭...
C语言在处理数学运算、函数调用和数据结构等方面有着强大的能力。 三、汇编语言编程 汇编语言是介于机器语言和高级语言之间的一种编程语言,每条指令对应单片机硬件的一个操作。虽然汇编语言编写代码的工作量较大,...
在STM32的HAL库中,Flash读写函数是关键组件,尤其适用于在掉电后仍需保持数据存储的应用场景。 首先,我们需要了解STM32的Flash存储结构。STM32的内部Flash通常分为多个扇区,每个扇区有固定的大小,如16KB或64KB...
3. **ecc.h**:头文件,定义了ECC算法的相关函数原型和数据结构,方便其他模块调用。 4. **ecc_read_1bit_error.txt、ecc_write.txt**:这些文件可能是测试过程中产生的数据,分别代表了写入Flash前的数据和存在...
在程序中,这些指令通常通过特定的函数调用来实现,如`Flash_EraseSector()`和`Flash_ProgramWord()`。 3. **地址映射**:理解单片机内部的地址空间布局是至关重要的。C8051F12X的FLASH存储区域有特定的地址范围,...
这个“C语言最基础教程(flash格式)”提供了一种交互式的学习方式,通过Flash动画来解释编程概念,使得学习更加直观和生动。尽管教程可能不完整,只有十课,但涵盖了C语言的基础部分,对初学者来说依然极具价值。 第...
内联函数是C编程语言中一个非常重要的特性,它允许函数体在被调用的地方直接展开,从而减少了函数调用的开销。在嵌入式系统编程,特别是针对微控制器如MSP430F4152这样的低功耗微处理器时,这种优化尤为重要,因为它...
在`main()`函数中,可能会调用上述模块的函数来完成初始化设置、擦除、写入和读取操作。 5. **max485.c**:MAX485是一种RS-485收发器,用于实现长距离的串行通信。如果在项目中使用了RS-485,那么这个文件将包含与...
在C语言中,函数型指针是一个非常强大的工具,它允许我们传递函数作为参数,或者将函数赋值给变量。这个“C语言33:用函数型指针控制P1口灯花样”的主题,显然是关于如何利用函数型指针来控制微控制器(可能是单片机...
在Qt框架中调用Flash(Adobe Flash Player)是通过ActiveX控件实现的,因为Flash在Web浏览器中通常是通过ActiveX技术来运行的。本文将详细介绍如何在Qt应用中利用ActiveX接口集成并运行Flash内容。 首先,我们需要...
在C++端,你需要编写一个动态链接库(DLL)或共享对象(SO),提供一组公开的函数供Flash调用。这些函数可以接收和返回各种类型的数据,如字符串、数字或自定义结构体。 在Flash端,使用ActionScript调用C++的函数...
`eeprom.c`是实现函数的源代码,而`eeprom.h`则声明了可供其他模块调用的函数原型。 1. **按页擦除**:Flash的擦除操作通常以页为单位进行,因为擦除一个页内的所有数据比单独擦除某些位更有效率。在`eeprom.c`中,...