守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1394|回复: 0

[入门技术] 使用最新Flash builder开发和使用Flash AIR ANE(Android版)图文...

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

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

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

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

    开源英雄守望者

    发表于 2015-1-24 17:38:43 | 显示全部楼层 |阅读模式
    注:本文转自中国游戏开发者(www.cgder.com),由已存在的一篇文章编辑整理而来,更适合使用Flash builder来开发的童鞋。(当然其它工具也是可以的,这里只需要FB就好了)

    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的开发过程

    注、
    a)本文使用的工具:Flash builder  4.6(其它如eclipse+FD什么的也行)
    b)必须先安装好jdk和android sdk并配置好相应的环境



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


    2.1 生成swc文件(使用Flash builder 新建Flex库项目,勾选包括adobe air库,清理编译后即可生成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程序中引用它里面的方法,而具体的实现则最终由本地程序中的方法来实现。
    1. package  com.juyou
    2. {
    3.         import flash.external.ExtensionContext;
    4.         public class FirstANE
    5.         {
    6.                 private var context:ExtensionContext;
    7.                 public function FirstANE()
    8.                 {
    9.                         try
    10.                         {
    11.                                 context = ExtensionContext.createExtensionContext("com.juyou.FirstANE", null);
    12.                         }catch (e:Error)
    13.                         {
    14.                                 trace("e:" + e);
    15.                         }
    16.                 }
    17.                 public function isSupported():Boolean
    18.                 {
    19.                         return context != null;
    20.                 }
    21.                 public function sendNotification(title:String, message:String):void
    22.                 {
    23.                         context.call("sendNotification", title, message);
    24.                 }
    25.                 public function dispose():void
    26.                 {
    27.                         context.dispose();
    28.                 }
    29.         }
    30. }
    复制代码
    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的实现:
    1. package com.juyou;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import android.util.Log;
    5. import com.adobe.fre.FREContext;
    6. import com.adobe.fre.FREFunction;
    7. public class FirstANEContext extends FREContext
    8. {
    9.         @Override
    10.     public void dispose() {
    11.         Log.i("FirstANEContext", "Dispose context");
    12.     }
    13.     @Override
    14.     public Map<String, FREFunction> getFunctions() {
    15.         Log.i("FirstANEContext", "Creating function Map");
    16.         Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>();
    17.         functionMap.put("sayHello", new SayHelloFunction() );
    18.         functionMap.put("sendNotification", new SendNotificationFunction() );
    19.         return functionMap;
    20.     }
    21. }
    复制代码
    FREFunction的实现:

    1. package com.juyou;
    2. import android.app.Notification;
    3. import android.app.NotificationManager;
    4. import android.app.PendingIntent;
    5. import android.content.Context;
    6. import android.content.Intent;
    7. import android.util.Log;
    8. import com.adobe.fre.FREContext;
    9. import com.adobe.fre.FREFunction;
    10. import com.adobe.fre.FREObject;
    11. import com.juyou.firstanandroid.R;
    12. public class SendNotificationFunction implements FREFunction {
    13.         @Override
    14.         public FREObject call(FREContext context, FREObject[] args) {
    15.                 FREObject result = null;
    16.                 String notificationString;
    17.                 String message;
    18.                 try
    19.                 {
    20.                         notificationString = args[0].getAsString();
    21.                         message = args[1].getAsString();
    22.                 }catch (Exception e) {
    23.                         Log.i ("SendNotificationFunction", e.getMessage());
    24.                         return result;
    25.                 }
    26.                 Context appContext = context.getActivity().getApplicationContext();
    27.                 int icon = R.drawable.ic_launcher;
    28.                 long when = System.currentTimeMillis();
    29.                 Notification notification = new Notification(icon, notificationString, when);
    30.             Intent notificationIntent = new Intent(context.getActivity(), context.getActivity().getClass());
    31.             PendingIntent contentIntent = PendingIntent.getActivity(appContext, 0, notificationIntent, 0);
    32.             notification.setLatestEventInfo(appContext, notificationString, message, contentIntent);
    33.             String ns = Context.NOTIFICATION_SERVICE;
    34.                 NotificationManager mNotificationManager = (NotificationManager) context.getActivity().getSystemService(ns);
    35.             mNotificationManager.notify(1, notification);
    36.                 return null;
    37.         }
    38. }
    复制代码
    FREContext在FREExtension中的初始化:
    1. package com.juyou;
    2. import android.util.Log;
    3. import com.adobe.fre.FREContext;
    4. import com.adobe.fre.FREExtension;
    5. public class FirstANEExtension implements FREExtension {
    6.         private FirstANEContext context;
    7.         private String tag = "FirstANEExtension";
    8.         @Override
    9.         public FREContext createContext(String arg0) {
    10.                  Log.i(tag, "Creating context");
    11.              if( context == null) context = new FirstANEContext();
    12.              return context;
    13.         }
    14.         @Override
    15.         public void dispose() {
    16.                 Log.i(tag, "dispose");
    17.         }
    18.         @Override
    19.         public void initialize() {
    20.                 Log.i(tag, "initialize");
    21.         }
    22. }
    复制代码
    最后将本地程序导出为jar包。

    2.3 打包ane

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

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <extension xmlns="http://ns.adobe.com/air/extension/3.1">
    3.   <id>com.juyou.FirstANE</id>
    4.   <versionNumber>1</versionNumber>
    5.   <platforms>
    6.     <platform name="Android-ARM">
    7.       <applicationDeployment>
    8.         <nativeLibrary>FirstANEAndroid.jar</nativeLibrary>
    9.         <initializer>com.juyou.FirstANEExtension</initializer>
    10.       </applicationDeployment>
    11.     </platform>
    12.   </platforms>
    13. </extension>
    复制代码
    另外将swc解压,从中抽取library.swf文件,现在我们手中的用于打包的文件清单包括:AndroidDialogAPI.swc,AndroidDialogAPI.jar,extension.xml和library.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目录下,添加对这两个文件的引用,然后就可以调用了。具体可以参考。
    1. package
    2. {
    3.         import com.juyou.FirstANE;
    4.         import flash.display.Sprite;
    5.         public class ANEExample extends Sprite
    6.         {
    7.                 private var ane:FirstANE;
    8.                 public function ANEExample()
    9.                 {
    10.                         super();
    11.                         ane = new FirstANE();
    12.                         if(ane.isSupported())
    13.                         {
    14.                                 trace(ane.sayHello("Hi Android ANE!"));
    15.                                 ane.sendNotification("坑爹???","不错,正是要坑爹!");
    16.                         }
    17.                 }
    18.         }
    19. }
    复制代码



    本文来自:http://bbs.9ria.com/thread-286334-1-1.html

    本帖子中包含更多资源

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

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

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

    本版积分规则

    
    关闭

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

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

    GMT+8, 2019-10-22 06:42 , Processed in 0.048913 second(s), 38 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

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