原文地址:
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,执行我们要的逻辑操作。这里会接收两个参数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.actionScriptData和FREContext. 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 开发本机扩展来读。特别是我文章中的那些链接。
相关推荐
1. **ANE结构**:一个ANE通常包括三个主要部分——ActionScript接口(AS3), native library(本地库)和描述文件(extension.xml)。AS3接口定义了ANE在AIR应用中暴露的API,本地库实现了这些API的实际功能,描述...
由于没有具体的博客内容,以上内容是根据通常的ANE教程结构推测的。如果要深入了解这个主题,最好还是访问提供的博客链接,查看详细的教程和示例代码。对于“nativeANE.ane”这个文件,它很可能是一个已经编译好的...
友盟推送ANE是一款适用于Android和iOS双平台的推送服务扩展包,它允许开发者轻松集成推送通知功能到他们的应用中。ANE(Adobe Native Extension)是Adobe Air的一个特性,它为Adobe Air应用程序提供了与原生移动平台...
2. **ANE结构** - **Android端**:ANE包含Android的aar库,这是对Android原生支付宝SDK的封装。开发者需要配置AndroidManifest.xml,添加必要的权限,并确保在应用中正确处理支付回调。 - **iOS端**:ANE包含iOS的...
ANE,全称Adobe Native Extension,是Adobe Flash Platform用于扩展Flash Player和Adobe AIR功能的一种机制。它允许开发者使用原生代码(如Java、Objective-C或C++)创建功能,然后在ActionScript项目中调用这些功能...
银联ANE,全称为Air Native Extension,是一种专为Adobe AIR应用程序设计的技术,使得开发者能够将原生移动平台的功能,如Android和iOS上的银联支付功能,整合到AIR应用中。这个压缩包包含了银联ANE在双平台...
移动MM ANE(ActionScript Native Extension)是一种专为Android平台设计的扩展库,它允许Flash开发者在Android应用程序中实现特定的原生功能。这个“移动MM ane 附源码”资源提供了1.2.3版本的弱联网功能,特别适用...
ANE,全称Adobe Native Extension,是Adobe Flash Platform的一部分,它允许开发者使用ActionScript与原生移动平台(如iOS和Android)进行交互,扩展Flash Player或Air的功能。在Xcode上创建ANE项目时,通常需要一个...
ANE,全称Adobe Native Extension,是Adobe AIR(Adobe Integrated Runtime)的一个重要特性,允许开发者使用原生代码(如Java或Objective-C)来扩展Flash和Flex应用程序的功能。在Android平台上,ANE使得开发者能够...
ANE由三部分组成:ActionScript接口(定义了在AS3中可调用的方法和属性)、原生库(实现这些方法的本地代码)和一个描述文件(XML,定义了ANE的结构和依赖关系)。 打包ANE的过程如下: 1. **编写原生代码**:根据...
2. **创建ANE结构**: - ANE的核心是一个动态链接库(DLL for Windows,.dylib for macOS,.so for Android,.framework for iOS)。 - 创建一个XML描述文件(extension.xml),用于定义ANE的元数据,包括名称、...
ActionScript接口定义了在Air应用中调用的API,本地库负责实现这些API,而描述文件则描述了ANE的结构和依赖关系。在这个案例中,`ANEInterface`包含了ActionScript的接口定义,而`QQANE`和`WeiboANE`则是对应QQ和...
1. **初始化ANE**:在项目中引入ANE文件,然后在AS3代码中导入ANE的库,创建ANE的实例。 2. **打开串口**:调用ANE提供的方法,指定要连接的串口设备和配置参数,如`aneSerial.open("COM1", 9600, 8, "N", 1)`,这...
3. **打包描述文件**:一个XML文件,描述了ANE的结构和依赖关系,包括ActionScript接口和原生库的对应关系。 **ANE的使用场景** ANE广泛用于实现无法通过纯ActionScript实现的功能,例如: 1. **硬件访问**:如...
本文将深入探讨如何集成百度和谷歌的广告ANE(Adobe Native Extension)到Android和iOS应用中,以实现有效的广告展示和优化用户体验。 首先,我们需要理解ANE的含义。ANE是Adobe Air的扩展机制,它允许开发者使用...
**微信登录支付分享ANE详解** 在移动应用开发中,与社交平台的集成是不可或缺的一环,其中微信作为中国最大的社交平台之一,其登录、支付、分享功能被广泛应用于各种应用程序中。本文将深入探讨“微信登录支付分享...
【标题】"admob ane android ios 稳定附例子详细教程"涉及的主要知识点是Adobe Air应用开发中集成Google AdMob广告网络的过程,适用于Android和iOS平台。AdMob ANE(Adobe Native Extension)是一种扩展,它允许Air...
标题 "ADO for AIR 的ANE工程源码" 指的是一个使用Adobe AIR(Adobe Integrated Runtime)技术,并结合ActiveX Data Objects (ADO) 来访问数据库的ActionScript Native Extension(ANE)项目源代码。ANE允许Flex应用...
- 开发者可以下载这个“android-ane-master”压缩包,解压后查看示例代码和项目结构。 - 首先,需要配置AS3库项目,定义好与Java库交互的接口。 - 其次,构建Java库项目,实现接口中定义的方法,处理Android特定...
《深入理解魅族安卓平台ANE开发技术》 在Android应用开发中,ANE(Air Native Extension)是一种强大的工具,它允许Adobe Air开发者利用原生的Java或C++代码来扩展AIR应用的功能,使得开发者能够访问设备的硬件特性...