AIR Native Extension on Android emulator

参考
1、官网教程:http://help.adobe.com/en_US/air/extensions/index.html
2、官网教材:http://www.adobe.com/devnet/air/articles/developing-native-extensions-air.html
3、网易博客:http://sswilliam.blog.163.com/blog/#m=0&t=3&c=nativeextension

开发目标
1、在Android模拟器上运行的AIR程序
2、可以调用Native的方法
3、可以接受Native发的事件

开发准备

1、Flash Builder4.5
2、AIRSDK3

FB支持Android开发
1、安装ADT
2、设置Android的SDK目录

准备文件夹
1、总目录:HelloANE
2、存放Native的目录:Native
3、存放Flex库目录:HelloANELibrary
4、存放App目录:HelloANESample

创建Native
1、在FB中创建Android项目:
      1、新建项目时选择Android project
      2、设路径为前面的Native
      3、Build target选择3.2
      4、Package名为:com.mydomain.example.android.helloANE
2、允许该项目使用AS提供的Extension功能
      1、打开该工程属性对话框
      2、在Java Build Path中,右部选择Libraries,点击“Add External JARs”,选择FB的SDK目录中lib/android里的FlashRuntimeExtensions.jar。
3、创建Extension类      

package com.mydomain.example.android.helloANE;import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;public class Extension implements FREExtension {@Overridepublic FREContext createContext(String arg0) {// TODO Auto-generated method stubreturn new ExtensionContext();}@Overridepublic void dispose() {// TODO Auto-generated method stub}@Overridepublic void initialize() {// TODO Auto-generated method stub}
}

4、创建ExtensionContext类      
package com.mydomain.example.android.helloANE;import java.util.Map;
import java.util.HashMap;import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;public class ExtensionContext extends FREContext {@Overridepublic void dispose() {// TODO Auto-generated method stub}@Overridepublic Map getFunctions() {// TODO Auto-generated method stubMap functionMap = new HashMap();functionMap.put("initMe", new InitFunction());functionMap.put("isSupported", new SupportedFunction());functionMap.put("Work", new WorkFunction());return functionMap;}
}
5、创建InitFunction类      
package com.mydomain.example.android.helloANE;import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;public class InitFunction implements FREFunction {@Overridepublic FREObject call(FREContext arg0, FREObject[] arg1) {// TODO Auto-generated method stubreturn null;}}

6、创建SupportedFunction类      
package com.mydomain.example.android.helloANE;import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;
import com.adobe.fre.FREWrongThreadException;public class SupportedFunction implements FREFunction {@Overridepublic FREObject call(FREContext arg0, FREObject[] arg1) {// TODO Auto-generated method stubFREObject result = null;try{result = FREObject.newObject(true);}catch(FREWrongThreadException e){e.printStackTrace();}return result;}
}

7、创建Work类
package com.mydomain.example.android.helloANE;import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;
import com.adobe.fre.FREWrongThreadException;
import com.mydomain.example.android.helloANE.MyThread;
import android.util.*;public class WorkFunction implements FREFunction {@Overridepublic FREObject call(FREContext arg0, FREObject[] arg1) {// TODO Auto-generated method stubFREObject result = null;try{Log.i("WorkFunction+Call", "Enter");MyThread thread = new MyThread(arg0);thread.start();result = FREObject.newObject("Native");}catch(FREWrongThreadException e){e.printStackTrace();}return result;}
}
8、创建MyThread类
package com.mydomain.example.android.helloANE;
import android.util.*;import com.adobe.fre.*;public class MyThread extends Thread {private FREContext MyExt = null;public MyThread(FREContext ext){Log.i("MyThread Constructor", "Enter");MyExt = ext;		}public void run(){Log.i("MyThread run", "Enter");MyExt.dispatchStatusEventAsync("BACK", "");}
}
9、导出JAR

创建AS库
1、创建Flex Library工程,名称为HelloANELibrary,确保Include AIR
2、创建一个AS的Class
package com.mydomain.nativeExtension.Work2
{import flash.events.EventDispatcher;import flash.events.IEventDispatcher;import flash.external.ExtensionContext;import flash.events.StatusEvent;public class Work extends EventDispatcher{private static var extContext:ExtensionContext = null;private static var isCallBack:Boolean = false;public function Work(target:IEventDispatcher=null){super(target);if(!extContext){extContext = ExtensionContext.createExtensionContext("com.mydomain.example","");extContext.addEventListener(StatusEvent.STATUS, OnStatus);extContext.call("initMe", null);}}public static function get isSupported():Boolean{return extContext.call("isSupported", null) as Boolean;}public static function OnStatus(event:StatusEvent):void{isCallBack = true;}public function Action():String{if(isCallBack){return "isCallBack is true";}else{return extContext.call("Work", null) as String;}}}
}

打包ANE
1、在Flex Library的bin目录下建立一个文件夹“Android-ARM”。这个文件夹用于存放针对Android的ANE文件,因为有可能一份AS库代码产生多种平台的代码。
2、提取SWF。用WINRAR打开SWC,把Library.swf提取出来,和swc放在同一目录下
3、准备extension.xml,描述native
com.mydomain.example1HelloANENative.jarcom.mydomain.example.android.helloANE.Extension

4、在bin目录下准备证书文件
5、在bin目录下准备批处理如下

set adt_dir="D:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\AIRSDK3\bin"
set sign=-storetype pkcs12 -keystore wvw.p12 -storepass geheim%adt_dir%\adt -package %sign% -tsa none -target ane Android-ARM\Helloane.ane extension.xml -swc HelloANELibrary.swc -platform Android-ARM library.swf HelloANENative.jar
6、运行批处理,如正常,将在Android-ARM下产生ane文件

创建使用Extension的App
1、创建一个Flex Mobile工程,名称为HelloANESample,Mobile Setting选择Blank,Target为Android,第四步中通过“Add Project”加入前面的Flex库工程
2、在App描述文件中(HelloANESample-app.xml)加入对extension的描述,如下
com.mydomain.example
3、界面代码如下




打包APK
1、把证书拷贝至App的输出目录
2、提供批处理如下
set adt_dir="D:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\AIRSDK3\bin"
set sign=-storetype pkcs12 -keystore wvw.p12 -storepass geheim%adt_dir%\adt -package -target apk-emulator %sign% myApp.apk HelloANESample-app.xml HelloANESample.swf -extdir D:\Code\HelloANE\HelloANELibrary\bin\Android-ARM
3、成功运行会在当前目录下生成myApp.apk

在模拟器上安装运行
1、启动3.2的模拟器
2、安装apk
3、运行,第一次按按钮,界面上文字会显示Native,第二次之后则显示“isCallBack is true”。



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部