`

ANE内部结构探究

ane 
阅读更多

原文地址:

http://blog.sina.com.cn/s/blog_5d323f950101d6rc.html

http://blog.sina.com.cn/s/blog_5d323f950101d4a4.html

 

继上一篇创建一个简单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,执行我们要的逻辑操作。这里会接收两个参数functionNameargs。在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 开发本机扩展来读。特别是我文章中的那些链接。
 
  • 大小: 44.2 KB
分享到:
评论

相关推荐

    ane打包范例及注意事项

    1. **ANE结构**:一个ANE通常包括三个主要部分——ActionScript接口(AS3), native library(本地库)和描述文件(extension.xml)。AS3接口定义了ANE在AIR应用中暴露的API,本地库实现了这些API的实际功能,描述...

    ANE调用原生对话框

    由于没有具体的博客内容,以上内容是根据通常的ANE教程结构推测的。如果要深入了解这个主题,最好还是访问提供的博客链接,查看详细的教程和示例代码。对于“nativeANE.ane”这个文件,它很可能是一个已经编译好的...

    友盟推送ANE,推送ANE

    友盟推送ANE是一款适用于Android和iOS双平台的推送服务扩展包,它允许开发者轻松集成推送通知功能到他们的应用中。ANE(Adobe Native Extension)是Adobe Air的一个特性,它为Adobe Air应用程序提供了与原生移动平台...

    支付宝ANE,支付宝

    2. **ANE结构** - **Android端**:ANE包含Android的aar库,这是对Android原生支付宝SDK的封装。开发者需要配置AndroidManifest.xml,添加必要的权限,并确保在应用中正确处理支付回调。 - **iOS端**:ANE包含iOS的...

    ane制作打包例子

    ANE,全称Adobe Native Extension,是Adobe Flash Platform用于扩展Flash Player和Adobe AIR功能的一种机制。它允许开发者使用原生代码(如Java、Objective-C或C++)创建功能,然后在ActionScript项目中调用这些功能...

    银联ANE

    银联ANE,全称为Air Native Extension,是一种专为Adobe AIR应用程序设计的技术,使得开发者能够将原生移动平台的功能,如Android和iOS上的银联支付功能,整合到AIR应用中。这个压缩包包含了银联ANE在双平台...

    移动MM ane 附源码

    移动MM ANE(ActionScript Native Extension)是一种专为Android平台设计的扩展库,它允许Flash开发者在Android应用程序中实现特定的原生功能。这个“移动MM ane 附源码”资源提供了1.2.3版本的弱联网功能,特别适用...

    ane在xcode上面的模板

    ANE,全称Adobe Native Extension,是Adobe Flash Platform的一部分,它允许开发者使用ActionScript与原生移动平台(如iOS和Android)进行交互,扩展Flash Player或Air的功能。在Xcode上创建ANE项目时,通常需要一个...

    ANE——Android本地编写

    ANE,全称Adobe Native Extension,是Adobe AIR(Adobe Integrated Runtime)的一个重要特性,允许开发者使用原生代码(如Java或Objective-C)来扩展Flash和Flex应用程序的功能。在Android平台上,ANE使得开发者能够...

    ANE打包AIR扩展示例

    ANE由三部分组成:ActionScript接口(定义了在AS3中可调用的方法和属性)、原生库(实现这些方法的本地代码)和一个描述文件(XML,定义了ANE的结构和依赖关系)。 打包ANE的过程如下: 1. **编写原生代码**:根据...

    ane打包规范及开发技巧

    2. **创建ANE结构**: - ANE的核心是一个动态链接库(DLL for Windows,.dylib for macOS,.so for Android,.framework for iOS)。 - 创建一个XML描述文件(extension.xml),用于定义ANE的元数据,包括名称、...

    Android新浪微博和QQ登录ANE

    ActionScript接口定义了在Air应用中调用的API,本地库负责实现这些API,而描述文件则描述了ANE的结构和依赖关系。在这个案例中,`ANEInterface`包含了ActionScript的接口定义,而`QQANE`和`WeiboANE`则是对应QQ和...

    Flash串口通信ANE.rar

    1. **初始化ANE**:在项目中引入ANE文件,然后在AS3代码中导入ANE的库,创建ANE的实例。 2. **打开串口**:调用ANE提供的方法,指定要连接的串口设备和配置参数,如`aneSerial.open("COM1", 9600, 8, "N", 1)`,这...

    AIR Native Extensions (ANE) Package

    3. **打包描述文件**:一个XML文件,描述了ANE的结构和依赖关系,包括ActionScript接口和原生库的对应关系。 **ANE的使用场景** ANE广泛用于实现无法通过纯ActionScript实现的功能,例如: 1. **硬件访问**:如...

    百度和谷歌广告的ane

    本文将深入探讨如何集成百度和谷歌的广告ANE(Adobe Native Extension)到Android和iOS应用中,以实现有效的广告展示和优化用户体验。 首先,我们需要理解ANE的含义。ANE是Adobe Air的扩展机制,它允许开发者使用...

    微信登录支付分享ANE

    **微信登录支付分享ANE详解** 在移动应用开发中,与社交平台的集成是不可或缺的一环,其中微信作为中国最大的社交平台之一,其登录、支付、分享功能被广泛应用于各种应用程序中。本文将深入探讨“微信登录支付分享...

    admob ane android ios 稳定附例子详细教程

    【标题】"admob ane android ios 稳定附例子详细教程"涉及的主要知识点是Adobe Air应用开发中集成Google AdMob广告网络的过程,适用于Android和iOS平台。AdMob ANE(Adobe Native Extension)是一种扩展,它允许Air...

    ADO for AIR 的ANE工程源码

    标题 "ADO for AIR 的ANE工程源码" 指的是一个使用Adobe AIR(Adobe Integrated Runtime)技术,并结合ActiveX Data Objects (ADO) 来访问数据库的ActionScript Native Extension(ANE)项目源代码。ANE允许Flex应用...

    Android代码-安卓ane模板

    - 开发者可以下载这个“android-ane-master”压缩包,解压后查看示例代码和项目结构。 - 首先,需要配置AS3库项目,定义好与Java库交互的接口。 - 其次,构建Java库项目,实现接口中定义的方法,处理Android特定...

    Android代码-魅族安卓平台ANE

    《深入理解魅族安卓平台ANE开发技术》 在Android应用开发中,ANE(Air Native Extension)是一种强大的工具,它允许Adobe Air开发者利用原生的Java或C++代码来扩展AIR应用的功能,使得开发者能够访问设备的硬件特性...

Global site tag (gtag.js) - Google Analytics