来源:http://www.cnblogs.com/alex-tech/archive/2012/03/22/2411264.html

ANE组成部分


在IOS平台中,ANE的组成部分基本分为AS 3.0扩展类库和Obj-C原生扩展类库两个部分,这两个部分打包后生成AIR扩展文件(.ane),最后和.swf起打包成IOS原生应用IPA文件。

Action Script类库构建


ANE的AS扩展部分是一个SWC,AIR 3.0 SDK里为flash.external.ExtensionContext类添加了新的方法,这里类名为NativeAlert.

1) 开发环境, Adobe AIR 3.0\3.1 SDK, Flash Builder或Flash Develop.

2) 建立Flex 库项目,编译的时候包括AIR库,链接方式设定为默认的外部链接.

3) 主要类NativeAlert与NativeAlertEvent.

4) 最终得到NativeAlert.swc

NativeAlert中主要工作:

  • 定义扩展唯一ID;
  • 通过指定ID,初始化上下文环境,获取实例;
  • 根据ane中导出的方法名encodeBMP调用原生类中定义的方法decode,参数为ByteArray和int,int;
   1:  package com.wanghui.nativeextensions
   2:  {
   3:      import flash.external.ExtensionContext;
   4:      import flash.utils.ByteArray;
   5:      
   6:      public class ImageProcessor
   7:      {
   8:          private var context:ExtensionContext;
   9:          
  10:          public function ImageProcessor()
  11:          {
  12:              context = ExtensionContext.createExtensionContext('com.wanghui.nativeextensions.myextension', ''); //@Attention[1]
  13:          }
  14:          public function decode(data:ByteArray)
  15:          {
  16:               var byteArray:ByteArray = data;
  17:               var transparent:int     = byteArray.readUnsignedByte();
  18:               // 调用原生类的decode方法
  19:               var handler:int         = int(context.call("decode",byteArray,byteArray.position,transparent)); //@Attention[2]
  20:          }
  21:      }
  22:  }

ExtensionContext通过静态方法createExtensionContext()来获得一个实例,参数com.wanghui.nativeextensions.myextension是这个扩展的ID,它非常重要,在扩展的配置文件里和应用程序描述文件中都需要用这个ID进行配对。

调用原生类中定义的方法可以用方法call()来实现,由于是同步调用,所以函数可以有返回值。还可以给ExtensionContext类添加事件侦听,用来获取从原生类中派发回来的事件。

Obj-C本地扩展


1)开发环境XCode

2) 建立Cocoa Touch Static Library;

3) 选择build settings,选中 Preprocessor Macros,移除所有标记,诸如DEBUG=1 and ${inherited};

4) 选择build settings,设定Enable linking with shared librariesYES;

5) 引入AIR SDK中的头文件FlashRuntimeExtensions.h;

6) 原生类中导出方法decode

7) 最终得到decoder.a

decode方法定义为返回FREObject方法,FREObject是接口类型,参数类型如下。这里要注意,与AS的接口包括函数返回值,都要定义成FREObject类型,比如代码中的handlerObject。

   1:  // ctx为上下文id,argc为参数个数,argv中为参数信息
   2:  FREObject decode(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
   3:  {
   4:      FREByteArray byteArray;
   5:      int position,transparent;
   6:      // 获取参数信息
   7:      FREAcquireByteArray(argv[0],&byteArray);
   8:      FREGetObjectAsUint32(argv[1],(uint32_t*)&position);
   9:      FREGetObjectAsUint32(argv[2],(uint32_t*)&transparent);
  10:      Handler *handler=malloc(sizeof(Handler));
  11:      
  12:      // Acquir之后进行Release
  13:      FREReleaseByteArray(argv[0]);
  14:      FREObject handlerObject;
  15:      // 申请返回数据空间
  16:      FRENewObjectFromUint32((uint32_t)handler,&handlerObject);
  17:      return handlerObject;      
  18:  }

要将decode方法定义为接口方法,需在ContextInitializer进行导出,指定导出的方法数,方法名称:

   1:  void ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx,
   2:          uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet){
   3:      initTables();
   4:      //定义的接口的数量
   5:      *numFunctionsToTest = 1;
   6:      //定义一个FRENamedFunction类型的实例func,初始化函数的个数
   7:      FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * 1);
   8:      //定义一个接口,name是字符串"decode";,函数体是decode
   9:      func[0].name = (const uint8_t*) "decode";
  10:      func[0].functionData = NULL;
  11:      func[0].function = &decode;
  12:      *functionsToSet = func;
  13:  }

ContextInitializer方法是在原生扩展类的初始化函数ExtInitializer中指定的:

   1:  void ExtInitializer(void** extDataToSet,FREContextInitializer* ctxInitializerToSet,FREContextFinalizer* ctxFinalizerToSet){
   2:      *extDataToSet = NULL;
   3:      *ctxInitializerToSet = &ContextInitializer;
   4:      *ctxFinalizerToSet = &ContextFinalizer;
   5:  }

ExtInitializer是原生扩展的程序入口,它可以通过扩展配置文件extension.xml来定义:

   1:  <extension xmlns="http://ns.adobe.com/air/extension/2.5">
   2:      <id>com.wanghui.nativeextensions.myextension</id>          <!--@ Attention [3]扩展ID>
   3:      <versionNumber>0.0.1</versionNumber>
   4:      <platforms>
   5:          <platform name="iPhone-ARM">
   6:              <applicationDeployment>
   7:                  <nativeLibrary>decoder.a</nativeLibrary>       <!--@ Attention [4]本地扩展库名称>
   8:                  <initializer>ExtInitializer</initializer> 
   9:                  <finalizer>ExtFinalizer</finalizer>
  10:              </applicationDeployment>
  11:          </platform>

打包ANE


1) decoder.a

2) NativeAlert.swc

3) NativeAlert.swc解压得到的library.swf

4) 扩展描述文件extension.xml

5) 利用AIR提供的adt打包,得到decoder.ane

adt -package  -target ane decoder.ane extension.xml -swc NativeAlert.swc -platform iPhone-ARM library.swf decoder.a

打包IPA


1) 写测试程序(flex手机项目),使用类库NativeAlert.swc,选择外部链接swc的方式,得到testmobile.swf;应用程序描述文件testmobile-app.xml,添加如下描述:

   1:  <extensions>
   2:  <!--@ Attention [5]扩展ID>
   3:  <extensionID> com.wanghui.nativeextensions.myextension </extensionID> 
   4:  </extensions>

1) decoder.ane,存放在ext目录下

2) 开发者设备授权文件 ceshi.mobileprovision

3) 开发者签名证书文件developerkey.p12

4) 打包ipa得到example.ipa

/adt -package -target ipa-test-interpreter -provisioning-profile ceshi.mobileprovision -storetype pkcs12 -keystore developerkey.p12 -storepass 1234 example.ipa testmobile-app.xml testmobile.swf -extdir ext

注:


1) @ Attention[1] [3] [5]位置的扩展ID一定要一致;

2) 模拟器中无法运行,调试可以选择输出调试信息的方式;

3) 运行程序后如果白屏立刻退出,确定[Obj-C本地扩展部分的] 3)4)两项设置是正确的;

AIR面向IOS设备的原生扩展的更多相关文章

  1. air for ios

    在 Adobe AIR 中为不同屏幕尺寸的多种设备提供支持 使用Flash Builder 4.5进行多平台游戏开发 手机屏幕触控技术与提升AIR在Android上的触控体验 AIR Native E ...

  2. 使用面向 iOS 的本机插件扩展 PhoneGap

    本文细致探讨了 Xcode(以 iOS 设备为目标)中的 PhoneGap(也称为 Apache Cordova)应用程序本机插件.如果您刚开始接触 PhoneGap 或者需要回顾 PhoneGap ...

  3. 系统设计 - 使用面向 iOS 的本机插件扩展

    本文转自:http://www.cnblogs.com/zhwl/archive/2013/07/26/3217155.html 本文细致探讨了 Xcode(以 iOS 设备为目标)中的 PhoneG ...

  4. 使用面向 iOS 的本机插件扩展

    本文细致探讨了 Xcode(以 iOS 设备为目标)中的 PhoneGap(也称为 Apache Cordova)应用程序本机插件.如果您刚开始接触 PhoneGap 或者需要回顾 PhoneGap ...

  5. Safari配置WebApp----添加启动图和桌面图标让你的WebApp在ios设备上体验如原生一样

    现在很多开发者的Web应用程序的设计样式和交互类似本机应用程序,例如,它的缩放比例适合iOS上的整个屏幕.当用户将其添加到主屏幕时,您可以通过使其看起来像本机应用程序一样,在iOS上为您的Web应用程 ...

  6. 面向移动设备的html5开发框架

    很久以前整理了篇将手机网站做成手机应用的JS框架.时隔一年多,很多新的技术已经出现,下面再来总结下还有哪些框架是适合面向手机设备的开发的. 1.jQuery Mobile jQuery Mobile ...

  7. (转)面向移动设备的HTML5开发框架

    (原)http://www.cnblogs.com/itech/archive/2013/07/27/3220352.html 面向移动设备的HTML5开发框架   转自:http://blogrea ...

  8. 如何选择面向移动设备的html5开发框架

    很久以前整理了篇将手机网站做成手机应用的JS框架.时隔一年多,很多新的技术已经出现,下面再来总结下还有哪些框架是适合面向手机设备的开发的. 1.jQuery Mobile jQuery Mobile ...

  9. 怎样将游戏从Unity导到iOS设备上

    当我开始开发自己的iOS游戏时,我会考虑的第一件事便是如何将其导出到设备中,如此有效地测试我的游戏.最初,该过程看似很长且复杂,我所遇到的主要问题是,尽管存在许多资源,但是它们并非完全来自同样的地方, ...

随机推荐

  1. 【vue】npm、node版本查看及npm常用命令

    1,版本查看 node -v npm -v 2,修改NPM的缓存目录和全局目录路径 D盘node目录下创建两个目录,分别是node_cache和node_global,这是用来放安装过程的缓存文件以及 ...

  2. http请求传参问题解决

    1.接口参数:使用form-data形式传参如果值太多就会报错误. 2.接口参数:使用form-data形式传参如果值太多就会报错误.这样前端可以传json就可以避免这样问题

  3. 初识HDFS(10分钟了解HDFS、NameNode和DataNode)

    概览 首先我们来认识一下HDFS, HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.它其实是将一个大文件分成若干块保存在不同服务器的多个节点中.通 ...

  4. Google Drive网盘文件直链获取一键脚本

    说明:本脚本可以将Google Drive网盘的文件分享链接或者文件ID变成直链,方便我们在很多情况下调用.只支持文件分享,不支持文件夹.文件分享ID为26到48位.   使用 1.需求 wget.g ...

  5. 算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组

    1.x的平方根 java (1)直接使用函数 class Solution { public int mySqrt(int x) { int rs = 0; rs = (int)Math.sqrt(x ...

  6. 【视频开发】【CUDA开发】FFMPEG硬件加速-nvidia方案

    1.目标 <1>显卡性能参数: <2>方案可行性: 2.平台信息 2.1.查看当前显卡信息 命令:  lspci |grep VGA  信息:  01:00.0 VGA com ...

  7. (转)Java中的String为什么是不可变的? -- String源码分析

    背景:被问到很基础的知识点  string  自己答的很模糊 Java中的String为什么是不可变的? -- String源码分析 ps:最好去阅读原文 Java中的String为什么是不可变的 什 ...

  8. elasticsearch的数据写入流程及优化

    Elasticsearch 写入流程及优化 一. 集群分片设置:ES一旦创建好索引后,就无法调整分片的设置,而在ES中,一个分片实际上对应一个lucene 索引,而lucene索引的读写会占用很多的系 ...

  9. 微服务架构下使用Spring Cloud Zuul作为网关将多个微服务整合到一个Swagger服务上

    注意: 如果你正在研究微服务,那必然少不了服务之间的相互调用,哪么服务之间的接口以及api就必须生成系统的管理文档了.如果你希望更好的管理你的API,你希望有一个工具能一站式地解决API相关的所有事情 ...

  10. 「模拟赛20191019」A 简单DP

    题目描述 给一个\(n\times m\)的网格,每个格子上有一个小写字母. 对于所有从左上角\((1,1)\)到右下角\((n,m)\)只向下或向右走的路径构成的集合,判断是否存在两条走法不同的路径 ...