`
mypyg
  • 浏览: 549612 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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-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语言函数算法实现.pdf》一文中提出了将Flash技术应用于C语言函数递归调用的教学当中。Flash是由Adobe公司开发的广泛应用于制作二维动画的软件,它具有文件体积小、携带...

    基于Flash的C语言程序动画技术实现的研究——以函数的递归调用为例.pdf

    在文章中,作者详细介绍了C语言函数递归概念的实现过程,包括递归的定义、递归算法的实现过程和栈结构的使用。然后,作者介绍了Flash动画的特点,包括矢量图形和流式播放技术、强大的影片剪辑特征和ActionScript的...

    AVR-GCC如何调用存储于Flash中的指向函数的指针

    当涉及到函数指针时,AVR-GCC提供了将函数指针存储到Flash中的能力,并能够从Flash中正确调用这些函数指针。本文将详细介绍如何在AVR-GCC环境下使用函数指针指向Flash中的函数,并调用它们。 首先,需要了解的是,...

    SPI口读写串行Flash M25P64要调用的函数.rar

    这个压缩包里面有两个文件:SPI_Flash.c 、SPI_Flash.h 。包括MSP430F149利用硬件SPI口读写串行Flash M25P64要调用的函数,在程序中有详细的说明,经本人调试,程序稳定可靠,大家放心下载

    C语言通过动态加载DLL实现调用JLink功能.zip

    总结来说,C语言通过动态加载DLL实现调用JLink功能,主要涉及`LoadLibrary`、`GetProcAddress`和`FreeLibrary`这三个Windows API函数,以及理解和使用JLinkDLL的接口。这个过程对于嵌入式开发人员来说非常实用,因为...

    flash 调用外部数组.doc

    在Flash编程中,调用外部数据,特别是数组,是一个常用且重要的技巧。这使得我们可以将数据存储在外部文件中,从而提高程序的可维护性和灵活性。在这个文档中,我们将探讨如何在Flash中加载和处理从外部文件导入的...

    flex air 调用C代码

    - **异步模式**:在异步模式中,调用C函数不会阻塞Flex应用,而是通过监听NativeProcess的事件(如`outputEvent`和`exitEvent`)来处理结果。这种方法适合长时间运行的任务,以避免冻结用户界面。 4. **编写C代码*...

    STM32操作FLASH断电记忆C语言源代码

    `Eeprom.c`通常是实现函数的具体代码,包括读取、写入和擦除FLASH的函数,而`Eeprom.h`则可能包含了函数声明和相关的常量定义,供其他模块调用。 在`Eeprom.c`中,我们可能会看到以下关键步骤: 1. **初始化**:...

    C语言几个实例 flash格式

    - **函数使用**:如何定义、调用函数,参数传递,以及递归函数的理解。 - **字符串处理**:使用字符串函数如strcpy、strcat、strcmp等进行字符串的操作和比较。 - **文件操作**:学习如何打开、读取、写入和关闭...

    带Flash的单片机编程C语言/汇编语言

    C语言在处理数学运算、函数调用和数据结构等方面有着强大的能力。 三、汇编语言编程 汇编语言是介于机器语言和高级语言之间的一种编程语言,每条指令对应单片机硬件的一个操作。虽然汇编语言编写代码的工作量较大,...

    STM32 HAL库 Flash读写函数

    在STM32的HAL库中,Flash读写函数是关键组件,尤其适用于在掉电后仍需保持数据存储的应用场景。 首先,我们需要了解STM32的Flash存储结构。STM32的内部Flash通常分为多个扇区,每个扇区有固定的大小,如16KB或64KB...

    FLASH-ECC校验算法的C语言实现

    3. **ecc.h**:头文件,定义了ECC算法的相关函数原型和数据结构,方便其他模块调用。 4. **ecc_read_1bit_error.txt、ecc_write.txt**:这些文件可能是测试过程中产生的数据,分别代表了写入Flash前的数据和存在...

    c8051读写FLASH程序

    在程序中,这些指令通常通过特定的函数调用来实现,如`Flash_EraseSector()`和`Flash_ProgramWord()`。 3. **地址映射**:理解单片机内部的地址空间布局是至关重要的。C8051F12X的FLASH存储区域有特定的地址范围,...

    C语言最基础教程(flash格式)

    这个“C语言最基础教程(flash格式)”提供了一种交互式的学习方式,通过Flash动画来解释编程概念,使得学习更加直观和生动。尽管教程可能不完整,只有十课,但涵盖了C语言的基础部分,对初学者来说依然极具价值。 第...

    inline-in-iar_c.rar_iar inline 函数_iar 内联函数_msp430f4152

    内联函数是C编程语言中一个非常重要的特性,它允许函数体在被调用的地方直接展开,从而减少了函数调用的开销。在嵌入式系统编程,特别是针对微控制器如MSP430F4152这样的低功耗微处理器时,这种优化尤为重要,因为它...

    基于MSP430的flash擦除读写操作代码

    在`main()`函数中,可能会调用上述模块的函数来完成初始化设置、擦除、写入和读取操作。 5. **max485.c**:MAX485是一种RS-485收发器,用于实现长距离的串行通信。如果在项目中使用了RS-485,那么这个文件将包含与...

    C语言33:用函数型指针控制P1口灯花样.rar

    在C语言中,函数型指针是一个非常强大的工具,它允许我们传递函数作为参数,或者将函数赋值给变量。这个“C语言33:用函数型指针控制P1口灯花样”的主题,显然是关于如何利用函数型指针来控制微控制器(可能是单片机...

    qt中调用flash的例子

    在Qt框架中调用Flash(Adobe Flash Player)是通过ActiveX控件实现的,因为Flash在Web浏览器中通常是通过ActiveX技术来运行的。本文将详细介绍如何在Qt应用中利用ActiveX接口集成并运行Flash内容。 首先,我们需要...

    c++与flash交互例程,包含as源码

    在C++端,你需要编写一个动态链接库(DLL)或共享对象(SO),提供一组公开的函数供Flash调用。这些函数可以接收和返回各种类型的数据,如字符串、数字或自定义结构体。 在Flash端,使用ActionScript调用C++的函数...

    英飞凌XC2300系列Flash驱动代码

    `eeprom.c`是实现函数的源代码,而`eeprom.h`则声明了可供其他模块调用的函数原型。 1. **按页擦除**:Flash的擦除操作通常以页为单位进行,因为擦除一个页内的所有数据比单独擦除某些位更有效率。在`eeprom.c`中,...

Global site tag (gtag.js) - Google Analytics