Android开发者的Ane简单入门
16lz
2021-12-04
一.Android native lib
FlashRuntimeExtensions.jar位于FB的目录如下:
..\Adobe Flash Builder 4.6\sdks\4.6.0\lib\android\
1.新建Android工程min SDK>=2.2(8)
2.去掉Create Activity的勾
3.导入FlashRuntimeExtensions.jar到libs下并build path
4.实现
FREExtension (Implements)
FREContext (extends)
FREFunction (Implements)
首先创建Function
ToastFunction
注意在第一次新建类的时候把包名填上
call方法是最终调用到Android native的地方,第二个参数是从Flex手机项目(AS3)传过来的参数数组
例如,如果传过来的第一个参数是String:
第一个参数可以获取Android运行的Context
最终的代码:
package com.example.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;public class ToastFunction implements FREFunction {@Overridepublic FREObject call(FREContext context, FREObject[] params) {String msg = null;try { msg = params[0].getAsString();} catch (IllegalStateException e) {e.printStackTrace();} catch (FRETypeMismatchException e) {e.printStackTrace();} catch (FREInvalidObjectException e) {e.printStackTrace();} catch (FREWrongThreadException e) {e.printStackTrace();}Toast.makeText(context.getActivity(), msg, Toast.LENGTH_SHORT).show();return null;}}
创建NativeContext
目的是返回一个存放本地方法的Mappackage com.example.anenativelib;import java.util.HashMap;import java.util.Map;import com.adobe.fre.FREContext;import com.adobe.fre.FREFunction;public class NativeContext extends FREContext {private static final String TOAST_FUNC_KEY = "toast";@Overridepublic void dispose() {}@Overridepublic Map<String, FREFunction> getFunctions() {Map<String,FREFunction> functions = new HashMap<String, FREFunction>();functions.put(TOAST_FUNC_KEY, new ToastFunction());return functions;}}
创建NativeExtension
该类负责与AS3 交互 主要修改的地方是createContext方法返回之前创建的NativeContextpackage com.example.anenativelib;import com.adobe.fre.FREContext;import com.adobe.fre.FREExtension;public class NativeExtension implements FREExtension {@Overridepublic FREContext createContext(String arg0) {return new NativeContext();}@Overridepublic void dispose() {}@Overridepublic void initialize() {}}
到这里Android Native Lib就完成了 右键工程,导出(Export),Java下的Jar文件 选择导出目标,即导出的路径 得到Jar包,完成第一步。
二.AS3 Lib
1.文件,新建,Flex库项目
2.新建AS类
3.实现
通过ExtensionContext与Native交互 com.example.myextension是一会新建extension.xml中要定义的一个ID,代表了android native extension 通过这个id得到extension的Context 之后调用call方法调用到Native层的Function 根据function_key找到对应的Function 例如toast对应我们之前定义的ToastFunctionpackage com.example.aslib{import flash.external.ExtensionContext;public class AndroidToast{public var extCtx:ExtensionContext=null;public function AndroidToast(){extCtx = ExtensionContext.createExtensionContext("com.example.myextension","");}public function showToast(msg:String):void{if(extCtx){extCtx.call("toast",msg);}}}}
4.创建extension.xml
在ASlib下创建一个文件命名为extension.xml 编辑id:com.example.myextension 和AS类里面使用的id一样,实际上,是AS类使用的ID必须和这里一样 编辑nativeLibrary:最早导出的jar包:nativelib.jar 编辑initializer:在Android代码中实现的Extension类的全称:com.example.anenativelib.NativeExtension<extension xmlns="http://ns.adobe.com/air/extension/3.1"> <id>com.example.myextension</id> <versionNumber>1</versionNumber> <platforms><platform name="Android-ARM"> <applicationDeployment> <nativeLibrary>nativelib.jar</nativeLibrary> <initializer>com.example.anenativelib.NativeExtension</initializer> </applicationDeployment> </platform> </platforms></extension>
到这里,我们得到3个文件: nativelib.jar extension.xml 在Flex库项目下的bin目录还有: ASlib.swc
5.设置打包目录
随便到一个目录下,新建一个文件夹,把这三个文件拷贝过来:把ASlib.swc后缀名改为zip并解压得到两个文件,并新建Android-ARM文件夹:
最后把ASlib后缀名改回来 将jar包和library.swf拷贝到Android-ARM内:
6.设置环境变量
在以下目录 ....\Adobe Flash Builder 4.6\sdks\4.6.0\bin有一个文件adt.bat 因此把FB的安装路径下的 ....\Adobe Flash Builder 4.6\sdks\4.6.0\bin添加到环境变量中
7.打包生成ane
回到之前的打包目录 shift+右键,选择“在此处打开命令窗口”进入到cmd界面 输入命令:(注意最后一个点不要漏掉,每个文章都有提到过) adt -package -target ane myane.ane .\extension.xml -swc .\ASLib.swc -platform Android-ARM -C .\Android-ARM .
回车后在该目录下生成 myane.ane文件 到这里ane文件就打包完成了。
在这里有一个很重要的问题要提一下: extension.xml不可以有任何注释,不然后面使用的时候会出现问题(XML文件不存在或者无效),导致了Flex手机项目找不到ASlib的类。(这是浪费我两天时间的罪魁祸首之一!!学习新东西就是各种细节问题)
三.Flex手机项目测试Ane
这里用上一篇文章《Android开发者的Air For Android简单入门》的Flex手机项目来测试1.右键工程,属性--Flex构建路径--本机扩展--添加Ane:出现红叉不要紧
2.接着点击Flex构建打包,选中google Android再在右边选中本机扩展
3.最右边“包”下有个CheckBox,看到了没有,赶紧点上(这是我卡了两天的罪魁祸首第一名!!)
打钩后,应用,确定
4.进入HelloFlexView.mxml 调用ane
5.运行
四.我遇到的几个问题
1.ane打包没有问题,但就是在调用的时候出现VerifyError #1014 Class .....could not found
原因:上面三.4的步骤,没有打钩2.打不上钩,XML文件不存在或者无效
原因:extension.xml文件有注释
更多相关文章
- android的布局文件简介
- Android(安卓)Studio 导出 .aar包的操作流程
- Android(安卓)应用开发笔记 - 图片视图(ImageView)
- Android(安卓)SVG动画PathView源码解析与使用教程(API 14)
- Android(java)学习笔记106:Android(安卓)XML解析
- Android(安卓)JNI环境搭建及开发入门
- Android(安卓)数据存储之文件存储小记
- Android系列教程之四:Android项目的目录结构
- Android(安卓)ListView控件基本用法