AIR面向IOS设备的原生扩展
来源: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 libraries为YES;
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设备的原生扩展的更多相关文章
- air for ios
在 Adobe AIR 中为不同屏幕尺寸的多种设备提供支持 使用Flash Builder 4.5进行多平台游戏开发 手机屏幕触控技术与提升AIR在Android上的触控体验 AIR Native E ...
- 使用面向 iOS 的本机插件扩展 PhoneGap
本文细致探讨了 Xcode(以 iOS 设备为目标)中的 PhoneGap(也称为 Apache Cordova)应用程序本机插件.如果您刚开始接触 PhoneGap 或者需要回顾 PhoneGap ...
- 系统设计 - 使用面向 iOS 的本机插件扩展
本文转自:http://www.cnblogs.com/zhwl/archive/2013/07/26/3217155.html 本文细致探讨了 Xcode(以 iOS 设备为目标)中的 PhoneG ...
- 使用面向 iOS 的本机插件扩展
本文细致探讨了 Xcode(以 iOS 设备为目标)中的 PhoneGap(也称为 Apache Cordova)应用程序本机插件.如果您刚开始接触 PhoneGap 或者需要回顾 PhoneGap ...
- Safari配置WebApp----添加启动图和桌面图标让你的WebApp在ios设备上体验如原生一样
现在很多开发者的Web应用程序的设计样式和交互类似本机应用程序,例如,它的缩放比例适合iOS上的整个屏幕.当用户将其添加到主屏幕时,您可以通过使其看起来像本机应用程序一样,在iOS上为您的Web应用程 ...
- 面向移动设备的html5开发框架
很久以前整理了篇将手机网站做成手机应用的JS框架.时隔一年多,很多新的技术已经出现,下面再来总结下还有哪些框架是适合面向手机设备的开发的. 1.jQuery Mobile jQuery Mobile ...
- (转)面向移动设备的HTML5开发框架
(原)http://www.cnblogs.com/itech/archive/2013/07/27/3220352.html 面向移动设备的HTML5开发框架 转自:http://blogrea ...
- 如何选择面向移动设备的html5开发框架
很久以前整理了篇将手机网站做成手机应用的JS框架.时隔一年多,很多新的技术已经出现,下面再来总结下还有哪些框架是适合面向手机设备的开发的. 1.jQuery Mobile jQuery Mobile ...
- 怎样将游戏从Unity导到iOS设备上
当我开始开发自己的iOS游戏时,我会考虑的第一件事便是如何将其导出到设备中,如此有效地测试我的游戏.最初,该过程看似很长且复杂,我所遇到的主要问题是,尽管存在许多资源,但是它们并非完全来自同样的地方, ...
随机推荐
- 最近b站好像把blv格式换成m4s,改成mp4之后没有声音,
我研究了几个小时,然后知道一个方法,但是必须有电脑.1.m4s 的视频改为mp4可以拖进pr2.m4s的音频不能直接拖进pr(会报错),改为mp3也一样,要先改为mp3,然后在格式工厂里面选择,mp3 ...
- 函数式接口, Collection等
Lambda 函数式接口 lambda 表达式的使用需要借助于 函数式接口, 也就是说只有函数式接口才可以将其用 lambda 表达式进行简化. 函数式接口定义为仅含有一个抽象方法的接口. 按照这个定 ...
- GIS地理处理脚本案例教程——批量栅格分割-批量栅格裁剪-批量栅格掩膜-深度学习样本批量提取
GIS地理处理脚本案例教程--批量栅格分割-批量栅格裁剪-批量栅格掩膜-深度学习样本批量提取 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 关键 ...
- [转]CSS3 使用 calc() 计算高度 vh px
1.px 像素,我们在网页布局中一般都是用px. 2.百分比 百分比一般宽泛的讲是相对于父元素,自适应网页布局越来越多,百分比也经常用到了. 3.Viewport viewport:可视窗口,也 ...
- Android dump命令查看某个apk是被谁安装的?
adb shell dumpsys package packages > packageAll.txt ORadb shell pm dump packages > package ...
- Java12新特性 -- JVM 常量 API
Java 12 中引入 JVM 常量 API,用来更容易地对关键类文件 (key class-file) 和运行时构件(artefact)的名义描述 (nominal description) 进行建 ...
- EasyRTMP推送扩展支持HEVC(H265) RTMP推送之Metadata结构填写详解
我们在<EasyNVR摄像机网页直播中,推流组件EasyRTMP推送RTMP扩展支持HEVC(H.265)的方案>中描述了关于EasyRTMP进行RTMP HEVC(H.265)推流的概括 ...
- 【414 error】nginx GET请求过长导致414错误
server{ ... } 在上面一段配置中添加如下两行 client_header_buffer_size 5120k; large_client_header_buffers 5120k; 并重启 ...
- TestDirector(TD)—测试管理工具
简介 TestDirector是全球最大的软件测试工具提供商Mercury Interactive公司生产的企业级测试管理工具,也是业界第一个基于Web的测试管理系统,它可以在您公司内部或外部进行全球 ...
- Android中的数据结构
数据结构在Android中也有着大量的运用,这里采用数据结构与源代码分析相结合,来认识Android的数据结构 线性表 线性表可分为顺序存储结构和链式存储结构 顺序存储结构-ArrayList 通过对 ...