如何制作ANE+Android以及ANE开发中可能遇到的坑
因为公司的项目是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开发中可能遇到的坑相关推荐
- Android短视频开发中的sdk接入方案
目前短视频平台非常火,云豹科技作为优质的app源码提供商,在短视频开发领域有丰富的经验和完善的技术.下面以云豹短视频为例,概述Android短视频开发中的sdk接入方案,这里我们选择腾讯云的sdk进行 ...
- 【前端实例代码】使用 HTML CSS实现指纹扫描仪特效动画效果 |前端开发 网页制作 基础入门教程 网页开发中常见的样式与特效,收藏起来肯定用的上~
b站视频演示效果: [web前端特效源码]使用 HTML CSS 和 JavaScript 实现指纹扫描仪特效动画效果 |前端开发 网页制作 基础入门教程 效果图: 完整代码: <!DOCTYP ...
- Android studio安装过程中入的坑的记录与记录
Android studio安装过程中入的坑的记录与记录 * 由于最近项目的需求,所以最近一直在配置安卓的开发环境,之前用的是Eclipse + ADT的模式开发的,配置环境也花了一些时间,但是由于谷 ...
- Widget开发中遇到的坑
1.在Manifest文件中声明 <receiver android:name=".receiver.GoldWidgetProvider"><intent-fi ...
- 前端项目开发中碰到的坑、移动端兼容性问题
前端开发中碰到的坑.移动端兼容性问题 1.ios兼容input光标高度 问题:input输入光标,在安卓手机上显示没有问题,但是在苹果手机上当点击输入的时候,光标的高度和父盒子的高度一样. **出现问 ...
- celery开发中踩的坑
celery开发中踩的坑 celery连接redis 当使用redis做broker,redis连接需要密码时: BROKER_URL='redis://:xxxxx@127.0.0.1:6379/0 ...
- 记一次ios内购开发中踩的坑
记一次ios内购开发中踩的坑 前段时间好不容易把APP中的非续期内购上架成功了,过程也是一波三折,各种问题,但最终还是内购审核通过了 通过后我以为就没问题了,但第二天打开xcode运行应用后,准备验证 ...
- 【Android】iOS开发中xconfig和script脚本的使用
利用Xcode进行开发时需要进行很多build setting的设置以便能让项目按照设置的进行编译,同时有时候需要在编译时利用script脚本进行一些设置,本文主要介绍xconfig文件和script ...
- Android Studio安卓开发中使用json来作为网络数据传输格式
如果你是在安卓开发中并且使用android studio,要使用json来作为数据传输的格式,那么下面是我的一些经验. 一开始我在android studio中导入那6个包,那6个包找了非常久,因为放 ...
- Android直播软件开发中接入腾讯IM大概流程是怎样的
现阶段来看,直播软件中的即时通讯是非常重要的一个部分,毕竟直播过程中的交流和沟通是非常重要的,所以在Android直播软件开发时需要接入相关的IM服务. 通常我们选择的即时聊天服务,会选择集成简单方便 ...
最新文章
- ios游戏开发 Sprite Kit教程:初学者 2
- 32GSSD组建RAID0后对硬盘的加速效果
- Java SE Eclipse中引入第三方jar及class
- vue-resource全攻略
- matlab 嵌入式,面向嵌入式系统的 MATLAB 和 Simulink
- 简约超好看自适应团队介绍页源码
- 死锁避免算法--银行家算法
- Java程序低手之关于泛型(Generic)
- css的9个常用选择器
- signature=31dd91e9b698a2c577ac276c1a6ed0c4,openssl的man中文文档 - 1(转)
- 征战FPGA之制作FLASH烧写用的bin文件
- 2021年声纹识别研究与应用学术研讨会笔记
- apache2添加网站配置
- IDEA每次启动都会Indexing
- 小雷的冰茶几(并查集)
- android 广播的插件化
- 安装chrome扩展插件.Crx文件时,总提示程序包无效:CRX_HEADER_INVALID
- linux shell 命令之 uname
- 二十四节气之大暑时节常识介绍
- mysql优化器怎么选择索引,为什么MySQL查询优化器会选择聚集主索引上的二级索引?...
热门文章
- 74HC595级联电路编程篇(四)
- 密码算法测试向量——Cipher MAC SM4
- 机器学习资源备份,转载自大神https://zhuanlan.zhihu.com/p/26876504
- C#中Action和=>用法(入门)
- dedecms如何在首页调用会员信息(会员头像和名字等)
- 我写过的软件之TSE-工作流程和实现
- Java自动拆装箱总结
- TSC打印机使用教程终极版(转)
- 畅游人工智能之海 | Keras教程之Keras的知识结构
- 超强大的数学计算器——WolframAlpha(含安卓下载连接)