http://blog.csdn.net/linxcool/article/details/7770179
概述
Adobe Air是利用Adobe公司的Flash技术开发的媒体播放平台。而Native Extension就是让AIR可以调用各个平台上的本地代码(native code, 如ios上的object-c,android上的java,desktop上的c++,c#等),从而完成对AIR中Actionscript API的自定义扩展。即可以让开发者通过编写基于平台的本地代码扩展ActionScript。从而完成一些原有Actionscript无法完成的功能。
Native Extension结构及原理
一个NativeExtension项目主要有两个部分组成:As 端的库项目和底层代码的实现项目。
下图是Android 上整个NativeExtension项目的体系结构。
AS库项目部分
ExtensionContext是其核心类,负责与Java代码的交互。ExtensionContext需要调用createExtensionContext方法创建和初始化Java端的本地代码。而是用call方法可以调用具体的Java代码并获得返回结果。同时Extension还会接受从java代码抛出的事件。
本地java项目部分
关键类 FREContext
关键接口 FREExtension、FREFunction
FREExtension是java端自定义代码的入口,需要重写createContext方法从而获得本地代码的上下文,即自己扩展的FREContext子类。
FREFunction是本地方法的具体实现,实例化后以键值对的形式存入FREContext,从而在AS端的ExtensionContext中调用的call方法中传入对应键值调起本地方法。
开发流程
项目分成三部分:Android项目,Flex Library库项目和Flex Mobile项目
Android项目
1、在Eclipse中新建Android项目,不必勾选创建Activity
2、将项目的类型设为Library型
properties -> Android -> 勾选 Is Libirary
3、导入Ane android jar包(FlashRuntimeExtensions.jar)
4、添加java本地实现
- public class SkyExtension implements FREExtension{
- @Override
- public FREContext createContext(String pType) {
- return new SkyContext();
- }
- @Override
- public void dispose() {}
- @Override
- public void initialize() {}
- }
public class SkyExtension implements FREExtension{
@Override
public FREContext createContext(String pType) {
return new SkyContext();
}
@Override
public void dispose() {}
@Override
public void initialize() {}
}
- public class SkyContext extends FREContext{
- @Override
- public void dispose() {}
- @Override
- public Map<String, FREFunction> getFunctions() {
- HashMap<String, FREFunction> map = new HashMap<String, FREFunction>();
- map.put("keyA", new TestToastFunction());
- //可继续put其他function
- return map;
- }
- }
public class SkyContext extends FREContext{
@Override
public void dispose() {}
@Override
public Map<String, FREFunction> getFunctions() {
HashMap<String, FREFunction> map = new HashMap<String, FREFunction>();
map.put("keyA", new TestToastFunction());
//可继续put其他function
return map;
}
}
- public class TestToastFunction implements FREFunction{
- @Override
- public FREObject call(FREContext context, FREObject[] params) {
- Toast.makeText(context.getActivity(), "测试成功:android本地被调用", Toast.LENGTH_LONG).show();
- FREObject result=null;
- try {
- result = FREObject.newObject("这是可返回的值");
- } catch (Exception e) {
- e.printStackTrace();
- }
- return result;
- }
- }
public class TestToastFunction implements FREFunction{
@Override
public FREObject call(FREContext context, FREObject[] params) {
Toast.makeText(context.getActivity(), "测试成功:android本地被调用", Toast.LENGTH_LONG).show();
FREObject result=null;
try {
result = FREObject.newObject("这是可返回的值");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
5、导出jar包(AneTestNative.jar)
Flex Library库项目
1、新建Flex Library项目,注意指定AIR3的SDK,并且勾选“包括Adobe AIR库”
2、在src下新建包,并添加as代码
- package com.linxcool.test
- {
- import flash.external.ExtensionContext;
- public class HelloWorldExtension
- {
- public static const KEY:String = "keyA";//与java端中Map里的key一致
- public static const EXTENSION_ID:String = "extTest";//与extension.xml中的id标签一致
- private var extContext:ExtensionContext;
- public function HelloWorldExtension()
- {
- //第二个为参数,会传入java代码中的FREExtension的createContext方法
- extContext = ExtensionContext.createExtensionContext(EXTENSION_ID,"");
- }
- public function hello(name:String):String{
- if(extContext){
- return extContext.call(KEY,name) as String;
- }
- return "call failed";
- }
- }
- }
package com.linxcool.test
{
import flash.external.ExtensionContext;
public class HelloWorldExtension
{
public static const KEY:String = "keyA";//与java端中Map里的key一致
public static const EXTENSION_ID:String = "extTest";//与extension.xml中的id标签一致
private var extContext:ExtensionContext;
public function HelloWorldExtension()
{
//第二个为参数,会传入java代码中的FREExtension的createContext方法
extContext = ExtensionContext.createExtensionContext(EXTENSION_ID,"");
}
public function hello(name:String):String{
if(extContext){
return extContext.call(KEY,name) as String;
}
return "call failed";
}
}
}
3、在src下新建名为extension.xml的文件
- <?xml version="1.0" encoding="UTF-8"?>
- <extension xmlns="http://ns.adobe.com/air/extension/2.5">
- <id>extTest</id>
- <versionNumber>1</versionNumber>
- <platforms>
- <platform name="Android-ARM">
- <applicationDeployment>
- <!--即为Android本地导出的jar包名-->
- <nativeLibrary>AneTestNative.jar</nativeLibrary>
- <!--即为Android本地FREExtension全路径-->
- <initializer>com.linxcool.test.SkyExtension</initializer>
- <finalizer>com.linxcool.test.SkyExtension</finalizer>
- </applicationDeployment>
- </platform>
- </platforms>
- </extension>
<?xml version="1.0" encoding="UTF-8"?>
<extension xmlns="http://ns.adobe.com/air/extension/2.5">
<id>extTest</id>
<versionNumber>1</versionNumber>
<platforms>
<platform name="Android-ARM">
<applicationDeployment>
<!--即为Android本地导出的jar包名-->
<nativeLibrary>AneTestNative.jar</nativeLibrary>
<!--即为Android本地FREExtension全路径-->
<initializer>com.linxcool.test.SkyExtension</initializer>
<finalizer>com.linxcool.test.SkyExtension</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension>
4、生成ANE文件
随便新建一个目录作为工作目录(AneBuild),并为其建立子文件夹Android-ARM
将Flex Library项目中自动生成的.swc文件和extension.xml复制到AneBuild目录下
以ZIP方式解压.swc文件获取catalog.xml和library.swf文件并存到Android-ARM文件夹下
拷贝AneTestNative.jar到Android-ARM文件夹下
拷贝自己的签名文件.p12到AneBuild文件夹下
最终结果
AneBuild:Android-ARM文件夹、.swc文件、extension.xml、.p12文件
Android-ARM:catalog.xml、library.swf、AneTestNative.jar
使用命令提示符进入到AneBuild文件目录下,使用adt命令对上述文件打包
- "D:\develop\Adobe\Adobe Flash Builder 4.5\sdks\4.5.0-air3.0\bin\adt" -package -storetype PKCS12 -keystore linxcool.p12 -storepass 08002615 -target ane aneTest.ane extension.xml -swc *.swc -platform Android-ARM -C Android-ARM .
"D:\develop\Adobe\Adobe Flash Builder 4.5\sdks\4.5.0-air3.0\bin\adt" -package -storetype PKCS12 -keystore linxcool.p12 -storepass 08002615 -target ane aneTest.ane extension.xml -swc *.swc -platform Android-ARM -C Android-ARM .
linxcool.p12:签名文件
08002615:签名密码
aneTest.ane:生成的ANE文件名
Flex Mobile项目
1、新建Flex Mobile项目
2、添加本地扩展添加上面所生成的ane包
3、编辑 app-xml文件添加android中所需的权限
4、调用Ane中的函数即可
附加
发现很多人在ANE打包过程中会有很多问题,我补充总结下:
1、若需要返回android端返回的数据
android端调用以下方法返回数据: FREContext.dispatchStatusEventAsync(标识, 内容);
flash 注册监听返回返回的数据:ExtensionContext.addEventListener(StatusEvent.STATUS,onStatus);
2、生成的APK资源ID无法引用
注意布局文件需要文字国际化。
将android端需要的资源文件拷贝到上诉的Android-ARM文件夹下。
并在android的代码中映射ID关系,在调用界面前调用如下代码:
- public static void setResourctID(String rName,FREContext context) throws Exception{
- Class<?> R = Class.forName(rName);
- Class<?>[] clss = R.getDeclaredClasses();
- for (int i = 0; i < clss.length; i++) {
- Class<?> cls = clss[i];
- Field[] flds = cls.getDeclaredFields();
- for (int j = 0; j < flds.length; j++) {
- Field fld = flds[j];
- fld.setAccessible(true);
- Object obj = cls.newInstance();
- String name = cls.getSimpleName()+"."+fld.getName();
- int id = context.getResourceId(name);
- fld.set(obj, id);
- }
- }
- }
public static void setResourctID(String rName,FREContext context) throws Exception{
Class<?> R = Class.forName(rName);
Class<?>[] clss = R.getDeclaredClasses();
for (int i = 0; i < clss.length; i++) {
Class<?> cls = clss[i];
Field[] flds = cls.getDeclaredFields();
for (int j = 0; j < flds.length; j++) {
Field fld = flds[j];
fld.setAccessible(true);
Object obj = cls.newInstance();
String name = cls.getSimpleName()+"."+fld.getName();
int id = context.getResourceId(name);
fld.set(obj, id);
}
}
}
其中rName为android生成R.java文件的全类名(如com.linxcool.air.R),打包时请打入。
3、assets资源、.so文件 问题
最简单的方式,生成的apk包解压,拷贝assets文件及so文件到APK包的对应目录下,重新打包签名即可。
4、FlashBuilder工程中引用ANE时报错(扩展XML文件无效或不存在)
不用理会。
5、打包的时候出现 Invalid swc file The extension NameSpace requires to SWF version to be 13 or lower
在AS库项目中右键属性 -> flex库编译器 ->附加库编译器参数 修改为-locale en_US -swf-version=13
其他一些ane打包so库的方法:
http://blog.csdn.net/rogiture/article/details/13986265
http://help.adobe.com/zh_CN/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html
相关推荐
在Android平台上,ANE使得开发者能够利用Android SDK中的功能,如访问硬件设备、系统服务等,这些在纯ActionScript中通常是无法直接实现的。 在“ANE——Android本地编写”这个主题中,我们将深入探讨如何创建一个...
这样,当运行在Android设备上的AIR应用执行这段代码时,就会弹出一个包含“Hello, Android!”的Toast消息。 总结来说,实现Flash与Android的交互涉及到创建一个Flex库项目来定义ANE的ActionScript接口,一个Android...
友盟统计ANE是针对Android和iOS应用开发的一款统计分析工具,它通过Air Native Extension(ANE)的方式,使得开发者能够方便地在跨平台的应用程序中集成友盟的统计服务。友盟是中国领先的移动互联网开放服务平台,提供...
4. **Android & iOS 平台支持**:由于AdMob ANE支持Android和iOS,开发者无需分别为两个平台编写不同的代码,只需在Air项目中引入ANE,就能在两种设备上展示广告。 5. **快速集成教程**:这个教程的目标是教会...
友盟社会化分享ANE,全称为Adobe Native Extension,是一种跨平台的解决方案,允许开发者在Adobe Air应用中集成原生功能,例如Android和iOS上的社交分享。在这个特定的版本v3.3.5中,友盟ANE针对Android和iOS平台...
- Java库项目是ANE在Android平台上的实现,负责与Android系统交互。 2. **AS3库项目**: - AS3库项目是ANE的核心组件之一,它是与AIR应用程序直接交互的部分。 - 开发者在AS3中定义接口,这些接口对应于Java库中...
本文将深入探讨如何在Android平台上实现新浪微博和QQ的登录功能,特别是通过ANE(Adobe Native Extension)技术来简化这一过程。ANE是Adobe Air提供的一种扩展机制,它允许开发者使用本地代码来扩展Air应用的功能,...
Flex for Android平台上的ActionScript Native Extensions(ANE)是一种强大的技术,允许开发者利用ActionScript与Android原生代码进行交互,从而扩展Adobe AIR应用的功能。在本文中,我们将深入探讨如何开发Flex for ...
在Android应用开发中,ANE(Air Native Extension)是一种强大的工具,它允许Adobe Air开发者利用原生的Java或C++代码来扩展AIR应用的功能,使得开发者能够访问设备的硬件特性或者系统级功能,如蓝牙、GPS等。...
移动MM ANE(ActionScript Native Extension)是一种专为Android平台设计的扩展库,它允许Flash开发者在Android应用程序中实现特定的原生功能。这个“移动MM ane 附源码”资源提供了1.2.3版本的弱联网功能,特别适用...
在Xcode上创建ANE项目时,通常需要一个合适的模板来简化开发流程。这个“ane在xcode上面的模板”就是为这样的目的而设计的。 首先,我们来看一下如何使用这个模板。在描述中提到,安装方法非常简单,只需要在终端中...
在Android上,友盟推送ANE会利用Google的Firebase Cloud Messaging (FCM)服务,而在iOS上则依赖Apple的Push Notification service (APNs)。开发者需要在友盟平台上注册应用,获取到对应的API密钥或证书,这些是配置...
标题"ANE制作打包例子"表明我们将探讨如何创建和打包ANE,特别是针对Flex和Android环境。这个过程涉及多个步骤,包括编写Java或ActionScript代码,创建SWC库,配置XML文件,以及执行打包命令。 描述中的"ane制作小...
支付宝ANE,全称为Alipay Native Extension,是一种针对Adobe Air开发的应用程序扩展,允许开发者在Air应用中集成支付宝的支付功能,实现iOS和Android双平台的支持。这个技术是为了解决移动应用中的付费问题,使用户...
2. **跨平台兼容**:ANE需要考虑多平台支持,确保在iOS、Android及其他可能的目标平台上都能正常工作。 3. **错误处理**:在AS3接口中添加适当的错误处理机制,当本地库出现问题时,能够优雅地返回错误信息,而不是...
您必须使用Mac才能使用此ANE来构建iOS应用。不支持Windows。 先决条件 你会需要 get Xcode 10.1 AIR 32.0.0.103或更高 ANE +依赖关系 从终端cd进入/ example-mobile并运行: bash get_ios_...
银联ANE,全称为Air Native Extension,是一种专为Adobe AIR应用程序设计的技术,使得开发者能够将原生移动平台的功能,如Android和iOS上的银联支付功能,整合到AIR应用中。这个压缩包包含了银联ANE在双平台...
在Android平台上,ANE可以用来增强Air应用程序的功能,比如本例中的“微派ANE”就提供了短信支付的支持。这个功能对于移动应用,尤其是游戏或电商类应用来说,是非常重要的,因为它使得用户可以直接在应用内完成支付...
标题“ANE调用原生对话框”涉及到的技术是ActionScript Native Extension(ANE),这是一种在Adobe AIR应用程序中调用原生平台功能的方法。ANE允许开发者利用AIR编写的应用程序访问iOS、Android等移动平台的特性和...
在Android平台上,它还支持Interactive Fullscreen模式,这意味着用户在全屏状态下依然可以与应用进行交互,如接收通知、控制音量等。 Adobe Integrated Runtime (AIR) 是一个跨平台的运行环境,允许开发者使用...