免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

ANE

本文参考来源
http://www.milkmangames.com/blog/2011/09/25/developing-android-extensions-for-air-3-a-beginners-guide/

http://www.adobe.com/devnet/air/native-extensions-for-air.html



1.ANE简介
Adobe AIR Native Extension,Adobe AIR的本地扩展,简称ANE。什么叫本地扩展?因为Adobe AIR是跨平台的一个运行时,可以在Windows,Mac,Android,iOS等系统上跑,正是因为其跨平台,所以它本身的功能就有局限性,不可能面面俱到;换句话来说,比如我们想在flash程序中调用一下系统的消息通知功能,但是AIR并没有这个功能,那么怎么办?这就要根据本地平台写段代码,让AIR委托本地平台去执行这段代码,这样就达到了拓展AIR程序的功能。换个角度来看问题,就好像系统有个dll文件,AIR可以去直接调用这个dll文件(这只是一个比方而已,让大家更容易理解,实际上AIR不能直接调用dll文件)。我们可以开发一个Android手机振动程序,然后打包成ANE,这样运行在AIR中的程序就可以调用写好的手机程序了。有了ANE机制,我们就可以开发很多Flash无法完成但是却可以使用的功能。
因为要根据不同的系统平台写ANE扩展包,有人就骂,AIR你不是号称跨平台,怎么又还要写一大堆ANE?是的,这样被人骂对于Adobe AIR来说也很无奈,毕竟AIR不是万能的,什么功能都可以写进去,否则AIR就会变得越来越庞大,越来越臃肿,这样大家自然不会去安装AIR了。当然你尽可以大骂ANE,但是如果你的实际项目中还是需要开发ANE,那就得花时间好好研究它吧。
因为存在不同的平台,这样就增加了我们开发ANE的难度。在Android手机上,我们需要用Android开发ANE;在iPhone手机上,我们需要用object-c来开发ANE;在Windows上,我们则需要用C++来开发ANE,这对于大部分只做AS代码的程序员而言,确实有点痛苦。不过不要紧,如果你的程序水平还可以,大可不必畏惧这些东西,毕竟程序是相通的,除了语法不同外,无非就是条件和循环,OOP都是差不多的,更重要的是有google和baidu,足矣。
你可以从Adobe官网http://www.adobe.com/devnet/air/native-extensions-for-air.html 下载一些ANE,然后将其后缀名改为.zip,解压后你可以看到这样一些东西在里面,



图1 ANE文件的解压内容


上图是一个消息推送的ANE文件的解压结果,其中省略了一些其他的文件和文件夹。由图可见,ANE运行不同的平台需要各自产生独立的本地文件,这里有Android和iPhone两个平台的本地文件,分别是jar包和a文件(静态链接库文件)。同时与本地文件并存的是library.swf文件,这是从一个swc文件中解压出来的。另外还有一个extension.xml文件,这是一个对扩展进行描述的Manifest文件,后面详述。




2. ANE的开发过程


ANE的开发分两步走,第一步需要生成一个swc文件,供AS程序调用;第二步需要生成本地程序,AIR会让系统执行它。


为方便起见,请参考http://www.milkmangames.com/blog/2011/09/25/developing-android-extensions-for-air-3-a-beginners-guide/ 此文中的操作和代码,我这里会省略其中的琐碎部分,突出重点。



2.1 生成swc文件


生成的swc文件主要用于两个地方,一是在将来开发时将其放在库里面进行引用;二是需要从这个swc中抽取library.swf文件,用于打包生成ane。


生成这个swc非常简单,代码量不多,主要使用flash.external.ExtensionContext类的call()方法,调用本地程序中的方法。这个ExtensionContext类非常类似我们经常调用javascript的ExternalInterface类。call()方法主要有两个参数,一个是本地程序的方法,另一个是传递给该方法的参数表。比如

ExtensionContext.

call("showMessage", "Nice to meet you!")表示调用本地程序中的showMessage()方法,同时把一个字符串当做传输传递进去。这个方法

showMessage()需要在本地程序中具体实现,如果实在Android中会写成一个Alert.show(),或者其他的形式。


写好这个swc之后,我们就可以在AS程序中引用它里面的方法,而具体的实现则最终由本地程序中的方法来实现。




package com.aneexample.extension{import flash.external.ExtensionContext;import flash.events.EventDispatcher;/** AndroidDialog */public class AndroidDialog extends EventDispatcher{        //        // Static Variables        //        /** Extension Context */        private static var extContext:ExtensionContext=null;        //        // Public Methods        //        /**         * Display a simple Android Dialog box.         * @param        msg        the message you wish to display.         */        public static function showDialogMessage(msg:String):void        {                initContext();                extContext.call("ffiShowDialogMessage",msg);        }        //        // Implementation        //        /** Init Context */        private static function initContext():void        {                if(!extContext)                {                        extContext=ExtensionContext.createExtensionContext("com.aneexample.AndroidDialog","");                        extContext.call("ffiInit");                }        }}}
Note:在编译生成swc的时候,需要加入编译参数 -swf-version 13 ,或更高的值,具体参考http://help.adobe.com/en_US/air/extensions/index.html



2.2  生成本地程序jar包


这里讨论的是Android本地程序,因此需要生成jar吧,iPhone则需要生成a文件。


在生成android的本地程序时,首先需要导入AIR SDK中的FlashRuntimeExtensions.jar,此文件在AIR SDK的路径下,比如我机器上是,


D:\Program Files\Adobe Flash Builder 4.6\sdks\4.6.0\lib\android\

FlashRuntimeExtensions.jar



对应于前面提到的

flash.external.

ExtensionContext,在jar中也有一个com.adobe.fre.FREContext,这个FREContext一方面寻找Android应用中的Activity,另一方面寻找来自

ExtensionContext请求的方法,因为在

FREContext里面有一个Map<String, FREFunction> getFunctions()的函数,完成了外部请求方法名与实际执行方法之间的映射,因此

FREContext可以在外部请求时,迅速找到并调用真正执行的方法。


实际中真正执行的方法必须要实现

FlashRuntimeExtensions.jar中的接口com.adobe.fre.

FREFunction

,在具体的代码实现中,通常利用

FREContext获取到Activity,然后将具体方法注入到Activity中。


虽然

FREContext是承载任务的核心类,但它还是要包在com.adobe.fre.FREExtension里面,利用

FREExtension.createContext()进行初始化,从而方便AIR获取

FREContext对象。总之,记住

FREContext的核心地位。


FREContext的实现:


public class AndroidDialogExtensionContext extends FREContext {        public android.app.Activity activity;                @Override        public void dispose() {                // TODO Auto-generated method stub                activity=null;        }        @Override        public Map<String, FREFunction> getFunctions()         {                Map<String,FREFunction> functionMap=new java.util.HashMap<String,FREFunction>();                functionMap.put("ffiShowDialogMessage",new AndroidDialogShowDialogMessageFunction());                functionMap.put("ffiInit",new AndroidDialogInitFunction());                return functionMap;        }}

FREFunction的实现:

public class AndroidDialogShowDialogMessageFunction implements FREFunction {        @Override        public FREObject call(FREContext context, FREObject[] args)        {                AndroidDialogExtensionContext adec=(AndroidDialogExtensionContext)context;                android.app.AlertDialog.Builder builder=new android.app.AlertDialog.Builder(adec.activity);                try                {                        String message=args[0].getAsString();                        builder.setMessage(message).setNeutralButton("OK",null).show();                }                catch(Exception e)                {                        android.util.Log.e("AIR_AndroidDialog",e.getMessage());                }                return null;        }}

FREContext在FREExtension中的初始化:

public class AndroidDialogExtension implements FREExtension {        @Override        public FREContext createContext(String arg0) {                return new AndroidDialogExtensionContext();        }        @Override        public void dispose() {                // TODO Auto-generated method stub        }        @Override        public void initialize() {                // TODO Auto-generated method stub        }}
最后将本地程序导出为jar包。

2.3  打包ane


有了swc和jar之后,还需要准备一个Manifest文件,即前面提到的extension.xml文件,此文件描述了各平台的本地程序以及入口/出口位置,供AIR阅读使用,

具体如下,




<extension xmlns="http://ns.adobe.com/air/extension/2.5">          <id>com.aneexample.AndroidDialog</id>          <versionNumber>1</versionNumber>          <platforms>                <platform name="Android-ARM">              <applicationDeployment>                <nativeLibrary>AndroidDialogAPI.jar</nativeLibrary>                <initializer>com.aneexample.androiddialog.AndroidDialogExtension</initializer>                <finalizer>com.aneexample.androiddialog.AndroidDialogExtension</finalizer>              </applicationDeployment>            </platform>          </platforms></extension>另外将swc解压,从中抽取library.swf文件,现在我们手中的用于打包的文件清单包括:AndroidDialogAPI.swcAndroidDialogAPI.jarextension.xmllibrary.swf,把这四个文件放到某个文件夹中,参考如下,


具体打包命令是AIR SDK中的adt,我机器上是在这个位置,
D:\Program Files\Adobe Flash Builder 4.6\sdks\4.6.0\bin\adt
可以把这个bin目录放到系统的环境变量Path中,这样我们就可以在cmd中直接调用adt。
打包命令有点长,具体可以参考AIR官方文档http://help.adobe.com/en_US/air/extensions/index.html
adt -package -target ane com.aneexample.AndroidDialog.ane .\extension.xml -swc .\AndroidDialogAPI.swc -platform Android-ARM -C .\Android-ARM .
Note:最后的一个点不要漏掉了。
这样我们就得到一个ane文件。


2.4 ane的测试和使用
ane的测试和使用很简单,只要把ane连同对应的swc文件一起放在待开发的AS项目的libs目录下,添加对这两个文件的引用,然后就可以调用了。具体可以参考
http://www.milkmangames.com/blog/2011/09/25/developing-android-extensions-for-air-3-a-beginners-guide/ 这篇文章整体过程讲的相当详细,推荐阅读。



-------------------------------------------------------------------
您身為 AIR 應用程式開發人員,應依照以下方式使用 ANE 檔案:


使用相同於在元件庫路徑中包含 SWC 檔案的方式,在應用程式元件庫路徑中包含 ANE 檔案。此動作可讓應用程式參考擴充功能的 ActionScript 類別。

備註: 編譯您的應用程式時,請務必使用 ANE 的動態連結。如果使用 Flash Builder,請在 ActionScript Builder 路徑屬性面板上指定「外部」;如果使用命令列,則指定 -external-library-path。


以 AIR 應用程式封裝 ANE 檔案。




自 AIR 3 起,您可在下列裝置中使用應用程式的原生擴充功能:

Android 裝置 (Android 2.2 以上)
iOS 裝置 (iOS 4.0 以上)
iOS 模擬器 (AIR 3.3 以上)
Blackberry PlayBook
支援 AIR 3.0 的 Windows 桌上型裝置
支援 AIR 3.0 的 Mac OS X 桌上型裝置

如果應用程式使用原生擴充功能,請在元件庫路徑中包含原生擴充功能的 ANE 檔案。然後,您可以使用 Flash Builder 來編譯 ActionScript 程式碼。

請使用 Flash Builder 4.5.1 執行下列步驟:

1.將 ANE 檔案的副檔名 .ane 變更為 .swc。這是讓 Flash Builder 找到檔案的必要步驟。

2.在 Flash Builder 專案上選取「專案 > 屬性」。

3.選取「屬性」對話方塊中的「Flex 建置路徑」。

4.在「元件庫路徑」索引標籤中,選取「新增 SWC...」。

5.瀏覽至 SWC 檔並選取「開啟」。

6.選取「新增 SWC...」對話方塊中的「確定」。
現在,ANE 檔案會出現在「屬性」對話方塊的「元件庫路徑」索引標籤中。

7.展開 SWC 檔項目。按兩下「連結類型」,以開啟「元件庫路徑項目選項」對話方塊。

8.在「元件庫路徑項目選項」對話方塊中,將「連結類型」變更為「外部」。


現在,您可以使用「專案 > 建置專案」來編譯應用程式 (舉例來說)。
與 Flash Professional 搭配使用 ANE 檔案
如果應用程式使用原生擴充功能,請在元件庫路徑中包含原生擴充功能的 ANE 檔案。然後,您可以使用 Flash Professional CS5.5 來編譯 ActionScript 程式碼。請執行下列動作:

1.將 ANE 檔案的副檔名 .ane 變更為 .swc。這是讓 Flash Professional 找到檔案的必要步驟。

2.在 FLA 檔上選取「檔案 > ActionScript 設定」。

3.在「進階 ActionScript 3.0 設定」對話方塊中選取「元件庫路徑」索引標籤。

4.選取「瀏覽至 SWC 檔案」按鈕。

5.瀏覽至 SWC 檔並選取「開啟」。

現在,SWC 檔出現在「進階 ActionScript 3.0 設定」對話方塊的「元件庫路徑」索引標籤中。

6.選取 SWC 檔後,選取「選取元件庫的連結選項」按鈕。

7.在「元件庫路徑項目選項」對話方塊中,將「連結類型」變更為「外部」。



請確定 ANE 檔案支援應用程式的目標裝置
提供 ANE 檔案時,原生擴充功能開發人員會通知您擴充功能支援哪些平台。您也可使用封存解壓縮工具來查看 ANE 檔案的內容。解壓縮的檔案包含每個支援平台的目錄。
封裝使用 ANE 檔案的應用程式時,瞭解哪些平台支援擴充功能,相當重要。請考慮下列規則:

若要建立 Android 應用程式套件,ANE 檔案必須包含 Android-ARM 平台。或者,ANE 檔案必須包含預設平台和至少一個其他平台。


若要建立 iOS 應用程式套件,ANE 檔案必須包含 iPhone-ARM 平台。或者,ANE 檔案必須包含預設平台和至少一個其他平台。


若要建立 iOS 模擬器應用程式套件,ANE 檔案必須包含 iPhone-x86 平台。


若要建立 MacOS X 應用程式套件,ANE 檔案必須包含 MacOS-x86 平台。或者,ANE 檔案必須包含預設平台和至少一個其他平台。


若要建立 Windows 應用程式套件,ANE 檔案必須包含 Windows-x86 平台。或者,ANE 檔案必須包含預設平台和至少一個其他平台。
返回列表