一.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

目的是返回一个存放本地方法的Map
package 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方法返回之前创建的NativeContext
package 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对应我们之前定义的ToastFunction

package 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 .\ASL
ib.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文件有注释



更多相关文章

  1. android的布局文件简介
  2. Android(安卓)Studio 导出 .aar包的操作流程
  3. Android(安卓)应用开发笔记 - 图片视图(ImageView)
  4. Android(安卓)SVG动画PathView源码解析与使用教程(API 14)
  5. Android(java)学习笔记106:Android(安卓)XML解析
  6. Android(安卓)JNI环境搭建及开发入门
  7. Android(安卓)数据存储之文件存储小记
  8. Android系列教程之四:Android项目的目录结构
  9. Android(安卓)ListView控件基本用法

随机推荐

  1. android 彩带动画,粒子动画
  2. Android动态设置View的位置和大小
  3. Android将发送的短信插入数据库
  4. Android 触屏播放音效与释放
  5. Android(安卓)中 View 炸裂特效的实现分
  6. android 调用camera相关操作
  7. android 添加menu 菜单项
  8. Android optionsmenu例程
  9. Android 实现上下滚动TextSwitcher
  10. Android The style on this component re