因为公司的项目是flash air的,所以会需要用到安卓的本地拓展,在网上找了很多关于如何写ane的文章,但是还是遇到了不少的坑。不过所幸最终还是自己解决了。

本文介绍的是:
ane+Android的,ane+ios的暂时没有涉及到,因为苹果的环境设置比安卓的要复杂一些,我这篇博客只是将ane+android做了一个简单的toast显示,如果有不懂的可以发邮件给我,邮箱地址在本文底部。

准备工作
1.Flash Builder 4.6
2.Android Studio
3.JDK/JRE

创建flash本地拓展库
直接上图

因为之前我已经创建过了,所以这里会有提示项目同名,不要紧,接着往下走,在库项目里创建一个AndroidToast.as文件,因为我这个测试的项目是想通过ane调用到安卓的Toast做测试,所以这样命名,你也可以选择你自己想要的命名。
1.
public class AndroidToast extends EventDispatcher

继承自EventDispatcher是因为需要在安卓底层完成某些事情之后,方便通知Air层的通知信息,看到网上大多数人都这样写,我能想到的目的好像就只有这一个。
2.
extCtx = ExtensionContext.createExtensionContext(“com.roub.Toast”,”“);
extCtx.addEventListener(StatusEvent.STATUS, onStatus); // 添加回调事件返回监听

通过ExtensionContext来访问本地代码 ,等于说这个东西就是承接上下文的中转,在安卓底层可以通过它的call()方法来调用到安卓的代码以及逻辑。

EXTENSION_ID:是我们创建的扩展的唯一标识,这个东西很重要,需要写在你的配置文件.xml里面,就是上面的“com.roub.Toast”

这里如果你没有找到ExtensionContext类的话,应该是你本地的SDK不是AIR的SDK,这个现在网上应该也有下载的,如果你实在是不知道怎么下载,文章底部我会留下联系方式,你可以给我发邮件,写完之后,代码大致如下。

package com.roub.Toast
{import flash.events.EventDispatcher;import flash.events.StatusEvent;import flash.external.ExtensionContext;public class AndroidToast extends EventDispatcher{  public var extCtx:ExtensionContext=null;  public function AndroidToast()  {  extCtx = ExtensionContext.createExtensionContext("com.roub.Toast","");  extCtx.addEventListener(StatusEvent.STATUS, onStatus); // 添加回调事件返回监听}  public function showToast(msg:String):Boolean{  if(extCtx){  extCtx.call("totast",msg);  //这里的totast是你跟安卓层约定好的固定字节,你可以自己更改return true;}return false;}  protected function onStatus(event:StatusEvent):void{}}
}

AS库的xml文件配置
AS库层还需要自己新建一个xml写入一定的配置,这里直接贴截图,nativeLibrary.jar我们后面再说,initializer也放在后面安卓层里再讲。

卓层的代码**
上面AS库的代码其实并不多,到了安卓层的话,其实代码了也还好,只是需要注意和配置的地方比较多,我个人用的是Android Studio3.0
新建一个项目,如下图,第二行的roub.com就是你这个项目的包名,你需要按照你在AS库里面的配置写下对应的包名。

先设置一下你的项目库显示方式,设置为如下图的方式最能直接的获取到类还有配置文件jar等信息。

安卓层只有以下几点,只要按照步骤来,就可以了
先找到FlashRuntimeExtensions.jar文件,这个东西在你的/AirSDK根目录/lib/android/FlashRuntimeExtensions.jar,也就是你的FB安装目录下面,当然,如果你实在是找不到,在这个文章的最底部我会留下邮箱(摊手……)
找到以后将这个文件拷贝到你Android Studio的项目lib文件下,然后引用就可以开始写代码了。

代码有三个部分
1.FREExtension
FREExtension是安卓层的入口,返回一个FREContext的对象,通过接口定义的createContext可以获得本地代码的上下文环境Context。简单粗暴,直接上代码:

package com.roub.anenativelib;import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;/*** Created by Roub on 2018/8/16.*/public class NativeExtension implements FREExtension{private static NativeContext context;@Overridepublic FREContext createContext(String arg0){context = new NativeContext();return context;}@Overridepublic void dispose(){}@Overridepublic void initialize(){}
}

2.FREContext
该对象就是本地代码的上下文环境,通过该对象的getFunctions()返回给AS层能够调用到的方法集合,该方法集合都是FREFunction的子类,简单来说就是这个东西你可以看做是一个数组,数组里存了很多AS可以调用的方法。对,就是这么简单,上代码。

package com.roub.anenativelib;import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;import java.util.HashMap;
import java.util.Map;/*** Created by Roub on 2018/8/16.*/public class NativeContext extends FREContext{private static final String TOAST_FUNC_KEY = "totast";@Overridepublic void dispose(){}@Overridepublic Map<String ,FREFunction> getFunctions(){Map<String, FREFunction> function = new HashMap<String, FREFunction>();function.put(TOAST_FUNC_KEY, new ToastFunction());return function;}
}

这里就要注意了,TOAST_FUNC_KEY就是你上面AS库文件里写的那个字符串totast,现在知道那个totast的用法了吧,这里你会看到有一个ToastFunction的类,这个类就是你在在安卓层需要写的代码了。

3.FREFunction
这里面有一个方法,叫做call,这个call方法与AS中的ExtensionContext的call方法是对应的,所有你需要在安卓层的代码,都需要在这里写,还是粗暴的贴代码吧,有不懂的发邮件。

package com.roub.anenativelib;import android.widget.Toast;import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREInvalidObjectException;
import com.adobe.fre.FREObject;
import com.adobe.fre.FRETypeMismatchException;
import com.adobe.fre.FREWrongThreadException;/*** Created by Roub on 2018/8/16.*/public class ToastFunction implements FREFunction{@Overridepublic FREObject call(FREContext context, FREObject[] param){String msg = null;try{msg = param[0].getAsString();Toast.makeText(context.getActivity(),msg,Toast.LENGTH_LONG).show();}catch (IllegalStateException e){e.printStackTrace();}catch (FRETypeMismatchException e){e.printStackTrace();}catch (FREInvalidObjectException e){e.printStackTrace();;}catch (FREWrongThreadException e){e.printStackTrace();}return null;}
}

这里的context就是你获得的上下文环境,
Toast.makeText(context.getActivity(),msg,Toast.LENGTH_LONG).show();这一行代码的意思就是调用安卓层的Toast提示来打印出你从AS层传过来的信息,至于效果,大概如下图所示。

这里的MyView.OnClick是一个字符串,也就是你从AS层传过来的msg,见上面的extCtx.call(“totast”,msg);

好了,至此你已经打通了整个流程,剩下的就是打包制作ANE的流程了。

项目截图放一张,主要是红色方框里的三个类,其余的可以无视,因为你能够使用的就这么多。

打包制作ANE
先用Android Studio导出项目的jar文件,通常你会获得一个classes.jar的文件。具体怎么生成这个,百度一下吧,太多方法了。
有了jar,我们再返回到刚刚写好的AS库项目,在库项目下bin目录下,你会发现一个.swc的文件,这是我们打包ANE最重要文件之一,如下图。

将这个文件拷贝出来,在桌面新建一个文件夹,不要用中文,避免出现路径问题,然后目录结构大概如下图

将ASLib.swc用压缩软件打开可以获取到extension.xml和library.swf,将library.swf还有你上面已经获得到的classes.jar放到Android-ARM目录下面。其他如图所示就可以了。

然后你新建一个TXT文本文档,在里面下下如下代码并改后缀为.bat:

adt -package -target ane myane.ane .\extension.xml -swc .\ASLib.swc -platform Android-ARM -C .\Android-ARM .

改完以后,直接运行.bat文件,你就能在当前目录下生成一个myane.ane文件,至此我们的ANE文件已经生成完毕。到此已经成功了一大半。

ANE的使用
将ane文件拷贝到你的AS项目的lib目录下,然后右键你的项目,属性找到如下图的地方,将ANE文件添加进去,然后你就可以在你的项目里面使用ANE了。

具体的调用代码如下:

package
{import flash.display.Sprite;import flash.display.StageAlign;import flash.display.StageScaleMode;public class AneDemo extends Sprite{public function AneDemo(){super();// 支持 autoOrientstage.align = StageAlign.TOP_LEFT;stage.scaleMode = StageScaleMode.NO_SCALE;var toast:AndroidToast = new AndroidToast();if(toast){toast.showToast("MyView.OnClick");}}}
}

很简单,就几行代码,其中toast.showToast(“MyView.OnClick”);就能看到上面的效果。”MyView.OnClick”就是你传送到安卓层的字符串信息,至此一个完整的ane打包制作流程就搞定了。

另外说点题外话
因为AEN本身功能并不能做通用,所以我在这里就不放出做好的ane下载,基本上每使用一个功能都需要自己去写一个ANE,当然你也可以将所有的功能都集合到一个ANE里面,另外ANE的制作过程中,会遇到诸如此类的问题:
1.接入第三方SDK的时候,ANE打包出错,而且出错的问千奇百怪
2.打包的时候提示各种文件缺少丢失
3.打包成功了ANE以后,在Flash Builder里面打包APK的时候提示各种错误
4.打包成功了APK,但是无法安装提示解析包错误
5.安装成功了APK,但是调用ANE函数后,没有任何效果,或者APP闪。
6.在ANE里面启动一个服务Service
7.在ANE里启动一个Activity
8.在ANE里的如何获得执行回调
9.ANE如何跟ActionScript进行数据通讯
……
反正各种坑,没办法,谁让你不是谷歌的亲儿子,这些问题只能说遇到一个解决一个,但是最坑的地方是网上资料真的是少的可怜,而且就算是同样的问题,还得根据你项目所需要的ANE去判断到底问题根源在哪儿,哎,也是巨坑。
最让人绝望的是,flash builder4.6好像根本不能联机调试,我自己试过了N台电脑,只有一台可以勉强调试,还是这台电脑心情好的时候才能联机调试(最近这台电脑心情极差,完全无法连接手机调试,悲剧ε(┬┬﹏┬┬)3)。只能自己一行一行的代码去猜测这一行会不会有问题。

附上自己的邮箱,如果有问题的小伙伴可以给我发邮件,基本我都会及时回复,不能保证给你解决所有的问题,但是大部分的坑我自己已经踩过了,互相提高,共勉。

邮箱:roub@foxmail.com
2018.8.16 By Roub

如何制作ANE+Android以及ANE开发中可能遇到的坑相关推荐

  1. Android短视频开发中的sdk接入方案

    目前短视频平台非常火,云豹科技作为优质的app源码提供商,在短视频开发领域有丰富的经验和完善的技术.下面以云豹短视频为例,概述Android短视频开发中的sdk接入方案,这里我们选择腾讯云的sdk进行 ...

  2. 【前端实例代码】使用 HTML CSS实现指纹扫描仪特效动画效果 |前端开发 网页制作 基础入门教程 网页开发中常见的样式与特效,收藏起来肯定用的上~

    b站视频演示效果: [web前端特效源码]使用 HTML CSS 和 JavaScript 实现指纹扫描仪特效动画效果 |前端开发 网页制作 基础入门教程 效果图: 完整代码: <!DOCTYP ...

  3. Android studio安装过程中入的坑的记录与记录

    Android studio安装过程中入的坑的记录与记录 * 由于最近项目的需求,所以最近一直在配置安卓的开发环境,之前用的是Eclipse + ADT的模式开发的,配置环境也花了一些时间,但是由于谷 ...

  4. Widget开发中遇到的坑

    1.在Manifest文件中声明 <receiver android:name=".receiver.GoldWidgetProvider"><intent-fi ...

  5. 前端项目开发中碰到的坑、移动端兼容性问题

    前端开发中碰到的坑.移动端兼容性问题 1.ios兼容input光标高度 问题:input输入光标,在安卓手机上显示没有问题,但是在苹果手机上当点击输入的时候,光标的高度和父盒子的高度一样. **出现问 ...

  6. celery开发中踩的坑

    celery开发中踩的坑 celery连接redis 当使用redis做broker,redis连接需要密码时: BROKER_URL='redis://:xxxxx@127.0.0.1:6379/0 ...

  7. 记一次ios内购开发中踩的坑

    记一次ios内购开发中踩的坑 前段时间好不容易把APP中的非续期内购上架成功了,过程也是一波三折,各种问题,但最终还是内购审核通过了 通过后我以为就没问题了,但第二天打开xcode运行应用后,准备验证 ...

  8. 【Android】iOS开发中xconfig和script脚本的使用

    利用Xcode进行开发时需要进行很多build setting的设置以便能让项目按照设置的进行编译,同时有时候需要在编译时利用script脚本进行一些设置,本文主要介绍xconfig文件和script ...

  9. Android Studio安卓开发中使用json来作为网络数据传输格式

    如果你是在安卓开发中并且使用android studio,要使用json来作为数据传输的格式,那么下面是我的一些经验. 一开始我在android studio中导入那6个包,那6个包找了非常久,因为放 ...

  10. Android直播软件开发中接入腾讯IM大概流程是怎样的

    现阶段来看,直播软件中的即时通讯是非常重要的一个部分,毕竟直播过程中的交流和沟通是非常重要的,所以在Android直播软件开发时需要接入相关的IM服务. 通常我们选择的即时聊天服务,会选择集成简单方便 ...

最新文章

  1. ios游戏开发 Sprite Kit教程:初学者 2
  2. 32GSSD组建RAID0后对硬盘的加速效果
  3. Java SE Eclipse中引入第三方jar及class
  4. vue-resource全攻略
  5. matlab 嵌入式,面向嵌入式系统的 MATLAB 和 Simulink
  6. 简约超好看自适应团队介绍页源码
  7. 死锁避免算法--银行家算法
  8. Java程序低手之关于泛型(Generic)
  9. css的9个常用选择器
  10. signature=31dd91e9b698a2c577ac276c1a6ed0c4,openssl的man中文文档 - 1(转)
  11. 征战FPGA之制作FLASH烧写用的bin文件
  12. 2021年声纹识别研究与应用学术研讨会笔记
  13. apache2添加网站配置
  14. IDEA每次启动都会Indexing
  15. 小雷的冰茶几(并查集)
  16. android 广播的插件化
  17. 安装chrome扩展插件.Crx文件时,总提示程序包无效:CRX_HEADER_INVALID
  18. linux shell 命令之 uname
  19. 二十四节气之大暑时节常识介绍
  20. mysql优化器怎么选择索引,为什么MySQL查询优化器会选择聚集主索引上的二级索引?...

热门文章

  1. 74HC595级联电路编程篇(四)
  2. 密码算法测试向量——Cipher MAC SM4
  3. 机器学习资源备份,转载自大神https://zhuanlan.zhihu.com/p/26876504
  4. C#中Action和=>用法(入门)
  5. dedecms如何在首页调用会员信息(会员头像和名字等)
  6. 我写过的软件之TSE-工作流程和实现
  7. Java自动拆装箱总结
  8. TSC打印机使用教程终极版(转)
  9. 畅游人工智能之海 | Keras教程之Keras的知识结构
  10. 超强大的数学计算器——WolframAlpha(含安卓下载连接)