守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 3014|回复: 3
打印 上一主题 下一主题

[技术知识] 从AS3.h,AS3++.h和Flash++.h里的几个函数/宏猜测FlasCC的内部结构

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52903
    钢镚
    1422

    开源英雄守望者

    跳转到指定楼层
    楼主
    发表于 2014-12-29 22:28:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    这应该是我的个人心得,所以用我最方言的语言来描述一下与大家分享,也做我自己的备忘。
    FlasCC的文档真不多,中文的就不用说了。除了天地会上翻译的几篇,别的我也没怎么看到。

    首选从我最近工作中的一个bug说起。程序如下:
    1,一个c/c++源文件,这个要用FlasCC编译成一个SWC。

    1. #include
    2. #include "AS3/AS3.h"
    3. void fn() __attribute__((used,
    4. annotate("as3sig:public function fn():void"),
    5. annotate("as3package:randy.test")));

    6. void fn(){
    7. int sum = 0;
    8. AS3_Trace(sum);
    9. }

    10. int main(){
    11.     AS3_GoAsync();
    12. }
    复制代码
    (这个编译可以通过,成功生成一个SWC。但我觉得这个FlasCC应该编译过不了才是合理的)
    1,一个AS3源文件,要使用上面生成的SWC,应该有一个AS3项目,只要有一个主类文件就够了,就是这个啦。

    1. package{
    2. import randy.test.fn;
    3. import flash.display.Sprite;
    4. public class TestFlasCC_SWC extends Sprite{

    5. public function TestFlasCC_SWC(){
    6. var r:* = fn();
    7. trace("===============");
    8. }
    9. }
    10. }
    复制代码
    OK,现在运行这个AS3项目。
    报错啦:::::
    ReferenceError: Error #1065: 变量 sum 未定义。
    at global/randy.test::fn()
    at TestFlasCC_SWC()[C:\workspace\Adobe\FlashBuilder\TestFlasCC_SWC\src\TestFlasCC_SWC.as:12]
    变量 sum 未定义。很显然,这个块程序里就应该是AS3_Trace(sum)这一句报错了。因为,只有这一行才是对sum有调用。
    经过了猜想,测试,。。。
    终于明白错在哪里了。
    把AS3_Trace(sum)这一句改了。
    改成,
    1. AS3::local::var var_sum = AS3::local::internal::new_int(sum);
    2. AS3::local::internal::trace(var_sum);
    复制代码
    然后,这回前面就应该要引入AS3++.h了。
    多一行#include "AS3/AS3++.h"
    现在c/c++源文件应该是这样的了。
    1. #include
    2. #include "AS3/AS3.h"
    3. #include "AS3/AS3++.h"
    4. void fn() __attribute__((used,
    5. annotate("as3sig:public function fn():void"),
    6. annotate("as3package:randy.test")));

    7. void fn(){
    8. int sum = 0;
    9. AS3::local::var var_sum = AS3::local::internal::new_int(sum);
    10. AS3::local::internal::trace(var_sum);
    11. }

    12. int main(){
    13.     AS3_GoAsync();
    14. }
    复制代码
    这样运行就正常了。你自己测试吧。
    从这个错误,我看到了。
    原来AS3_Trace()里的参数,实际上他是从AS3程序上下文里找的,因为我在AS3并没有定义sum这样的一个变量,所以未定义。而后一个C源文件编译的SWC就可以正常运行。没说找不到sum因为,是从C程序的上下文中查找变量。
    对此,我简单的感受到了FlasCC平台里的一些架构,主要有3点,
    1,变量区是独立的(不知道专业的名称是什么,在这里请允许我自己定这个名字 ^_^)
    从我这次的程序就很明显,C里定义的变量和AS3里的变量是在不同的区里。当然,其实就应该这样。只是调用FlasCC方法的时候,注意他需要的是哪个区里的变量。AS3_Trace方法,是C里的方法,但却是针对AS3里的变量。在FlasCC里别的C方法,如果有以AS3为前缀。我百分之九十九的肯定,也会是这样的。
    类似的另一个方法AS3::local::internal::trace(var_sum)就不是从AS3区里找变量了,使用的是C里的变量。只是注意需要封装成什么样了哦。
    2,介于AS3和C之间的一类东东
    既然变量区是有区别的,AS3和C是分开的。从AS3_Trace这个方法看,参数要找的是AS3里的变量,虽然可以用inline_as3来在C里定义AS3里的变量,让AS3_Trace可以正常运行。但是,有些时间你和我一样,很不愿意勉强这样做。毕竟我们写的是程序的C部分,尽量都在C里搞定吧。所以AS3++.h里的很多东西(很多宏,当然也有方法)就用上了。比如我用到的
    1. AS3::local::var var_sum = AS3::local::internal::new_int(sum);
    2. AS3::local::internal::trace(var_sum);
    复制代码
    在AS3++.h里,你还可以看到一堆。new_uint,new_Number,new_Boolean,new_String,,,以new_为前缀的方法。注意观察。这里有int,uint,Number,Boolean,String,没有char,C里有char字符类型的变量的嘛。看来。这是对AS3里变量类型的某一种映射呀,而且处在C程序中。最终可以供AS3::local::internal::trace()使用,直接扔一个C里的变量给AS3::local::internal::trace()编译都过不了。如下,
    1. int sum = 0;
    2. AS3::local::internal::trace(sum);
    复制代码
    编译的时候报错:
    swc.cpp: In function ‘void fn()’:
    swc.cpp:17: error: conversion from ‘int’ to non-scalar type ‘AS3::local::var’ requested
    Makefile:2: recipe for target `swc' failed
    make: *** [swc] Error 1
    所以我说这些new_int,new_uint方法生成的变量是介于AS3,C之间。
    除了new_方法,下面还有一堆bool_valueOf,int_valueOf,uns_valueOf,,,,作用和new_就比较相反了。还有别的,自己去看吧。
    3,C里的AS3
    这个要去Flash++.h里看啦。
    AS3里的那些类,
    你看Flash++.h的类,
    AS3::ui::flash::display::Stage
    AS3::ui::flash::display::Sprite
    AS3::ui::flash::display::Graphics
    AS3::ui::flash::events::Event
    在C里完全的写AS3呀。
    啊。。。。。

    本文来自:http://blog.sina.com.cn/s/blog_5d323f950101abc0.html

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
    收藏收藏1 分享分享 支持支持 反对反对 微信
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-12-30 09:03
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    8

    帖子

    209

    积分

    下士

    Rank: 3Rank: 3

    威望
    0
    贡献
    0
    金币
    136
    钢镚
    11
    沙发
    发表于 2014-12-30 09:02:44 | 只看该作者
    顶,学习了..........................
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2016-8-19 16:08
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    4

    主题

    31

    帖子

    2628

    积分

    少尉

    Rank: 6Rank: 6

    威望
    0
    贡献
    8
    金币
    320
    钢镚
    25
    板凳
    发表于 2015-1-11 14:52:18 | 只看该作者
    顶...................
    我是一个兵
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-9-12 17:23
  • 签到天数: 383 天

    [LV.9]以坛为家II

    21

    主题

    57

    帖子

    4万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    1066
    贡献
    0
    金币
    6358
    钢镚
    21
    地板
    发表于 2015-2-24 12:33:12 | 只看该作者
    頂~~~~
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2026-1-24 12:13 , Processed in 0.065215 second(s), 33 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表