守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

[高级技术] ANE内部结构探究

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

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

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

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

    开源英雄守望者

    跳转到指定楼层
    楼主
    发表于 2014-12-29 22:38:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    继上一篇创建一个简单ANE后,今天在这里将我在开发ANE过程中的一些心得和大家分享一下。主要是悟出来的一些关于ANE内部结构的心得。同时也参考了ADOBE的文档针对 Adobe AIR 开发本机扩展。也推荐你去阅读。然后将你的收获不吝和我分享。  ^_^ 如果你对关于怎么创建一个ANE还不是了解,建议你去读我的上一篇文章创建一个简单ANE(本篇文章的读者朋友需要有创建ANE,打包等的相应知识基础)。这里我就不花太多笔墨讲述操作过程。
    1,ANE其实就是一个拓展
    这个有点废话。ANE其实就是本地拓展的缩写。不过。我想要讲的是“拓展”这两个字,事实上,是关于ADOBE对他们运行平台的“拓展”的一个设计风格。关于“拓展”,ADOBE现在有两个实现类,都在flash.external包下,ExternalInterface类和ExtensionContext类。ExternalInterface类是关于AS3部分和运行平台外的JS层的交互,如果你对这个类不是很熟悉。建议你花一点点时间学习一下,虽然内容和ANE无关,但是关于ADOBE的拓展的设计,架构哲学是一样,看了这个类,你再去看ExtensionContext类,相信你肯定会非常有感觉,甚至兴奋。
    接下来,我们看我们真正需要了解的内容ExtensionContext类。其实,在这里,你只需要知道一点,想调用AS运行平台外的代码(非AS代码,目前可以在AS里通过ExternalInterface调外部的JS代码,通过ExtensionContext调用外部JAVA代码和C代码),你只要调用这里的call方法,平台就会帮你调用外部相应的代码。这两个类里都有这个call方法。其实,我觉得这就是ADOBE的“拓展”的设计哲学。
    只是ExtensionContext中的call不是靜态的,所以,你首先需要创建一个ExtensionContext实例,ExtensionContext中提供了一个createExtensionContext静态方法来创建实例。快结束后,还有一个dispose方法来销毁实例。所以,在开发ANE,AS部分的代码流程其实就是对这三个方法的调用。
    (1)调用createExtensionContext创建ExtensionContext实例,(2)调用call让平台来调用相应的外部方法,(3)调用ExtensionContext实例的dispose方法来销毁自己,完毕。
    2,ANE里AS与外部代码的结构
    我们来先看下面这幅图。
    左边部分就是上面提到的ANE内部AS部分的整个过程,其实是调用createExtensionContext,call,dispose三个方法的流程。而整个图描述的是根据ANE内部体系结构,AS与底层java部分的互动。
    当在AS中调用createExtensionContext时,底层相应的操作就是在FREExtension中调用createContext返回一个FREContext子类的实例,这个FREContext子类实例和AS中返回的ExtensionContext是一一对应的。至于createExtensionContext方法中传递的两个参数extensionID和contextType。可能你的应用中引入了多个ANE包,而每个包都有自己的ID,就是在extension.xml中的那个ID标签里的文本。根本这里的参数extensionID就可以找到相应ID的ANE包。剩下的那个contextType,在Adobe官方文档听起来好眩晕,其实就是简单的传到java端的一个字符串,没被做过任何处理。别管他那样吹了,你就觉得是在createContext方法中得到一个很有用的字符串而已。
    得到了ExtensionContext实例后,就是做真正要做的事情了。调用call,执行我们要的逻辑操作。这里会接收两个参数functionName和args。在ANE内部,在底层其实就是根据你传的functionName帮你找到那个标上了名为functionName的相应方法。在底层java中,这个相应的方法被封装成了FREFunction接口的一个实现类。这个接口有一个也叫call的方法需要java端开发者来实现,系统内部自然的会帮你找到这个FREFunction的实现类并且调用里面的call,在JAVA里返回FREObject,相对于AS里就是OBject类型。
    走到最后一步了,一切操作完毕,就是调用ExtensionContext实例里的dispose方法销毁实例。调用了ExtensionContext实例里的dispose,ANE内部就相应的调用了FREContext子类实例里的dispose。不过要注意的是,java端里的三个类型FREExtesnion,FREContext,FREFunction都有相应的dispose。至少他们是怎么相互调用的,欢迎你创建一个测试ANE,logcat出来和我分享。^_^
    关于这些内部结构的内容,可以阅读adobe文档本机扩展体系结构
    3,ANE内部的内存管理
    我们在第二点ANE里AS与外部代码的结构中,一直有提到java里的FREObject类,对应AS里的Object类。此外,从官方文档访问 ActionScript 对象使用 ActionScript 基元类型和对象相应的参考文档里还可以看到有FREArray,FREByteArray,FREBitmapData。不过我这里要提到的是,其实,AS部分和java部分,这里,是共享一块内存的。只是在不同的两端,名字不一样而已了,操作方法也有一点点不一样。你可以从我上面提到的两处文档里读到更详细的内容。
    4,ANE内部的线程
    在文档本机扩展与 NativeProcess ActionScript 类里,提到了ANE是在AS里的线程运行的。这里我分享一个我自己的经验。因为不同的线程的栈内存是不一样的。所以要注意一点,当你在java端的回调方法(比如UI事件操作监听器里)里,可能你把这些都写在了FREFunction的call方法的内部了,但是运行的时候,传过来的参数已经不可用了。因为是在不同的线程里了。其实就是文档里提到的FREObject 有效性(嘿嘿,自己读去 ^_^)。如果真要回调(其实我觉得一个好的API设计,都是要在最后调用一个回调方法,只是用户可以传空进来),就调用FREContext里的dispatchStatusEventAsync() 方法吧(参考调度异步事件),或者是使用context的全局变量,一看ExtensionContext.actionScriptDataFREContext. getActionScriptData()你就懂。
    5,关于swf版本
    这里涉及到版本主要是打包ANE时使用的swf版本和编写应用时最后打包的版本。原则就是ANE的版本不能超过应用的版本。
    简单的说就是创建ANE的AS部分的时候,导出的swc版本(编译参数--swf-version)应该和拓展描述符文件extension.xml中的命名空间,就是<extension xmlns="http://ns.adobe.com/air/extension/XX">中的XX要一致。而且这两个不能超过应用的--swf-version编辑参数。


    最后一个建议就是希望你结合官方文档针对 Adobe AIR 开发本机扩展来读。特别是我文章中的那些链接。
    最后祝你ANE很牛。也希望你为我这篇文章提出宝贵意见。

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

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
    收藏收藏 分享分享 支持支持 反对反对 微信
    守望者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:04:40 | 只看该作者
    顶.....................................
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

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

    本版积分规则

    
    关闭

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

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

    GMT+8, 2024-4-20 10:57 , Processed in 0.048551 second(s), 32 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

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