[AIR] AIR ANE巨详细教程

来源:互联网 发布:空巢老人调查数据 编辑:程序博客网 时间:2024/05/09 21:30
这几天用air做android项目,发现个功能air实现不了。得用android原生技术,但小弟菜蔬学浅,android原生是搞不懂了,还是AS用着顺手。于是跟度娘求助,然后就发现了ANE这东东,但发现关于ane的中文资料灰常少,度娘上的资料基本都是官方性质的,用词都很官方(神马是上下文环境啊,完全不懂 - -#),后来还是谷哥靠谱,资料稍多点,但都是E文的呃,但这小小的困难怎么能难倒哥呢,要知道,哥电脑上可是装了有道词典的!     于是在走了N多弯路后终于把这玩意弄懂了(不容易啊 - -#)。本着造福后人的思想,小生就把这个东西的玩法用天朝文写下来啦。
     OK,先简单说说ANE是啥吧(不想看废话的请跳过这段)。 ANE(AIR Native Extension),就是本机扩展,顾名思 就是对air运行的本机的扩展(还是没听懂?)。好吧,我的理解就是air不能实现的功能,就用ane来实现。比如我要用air来控制电脑的鼠标移动,这个功能貌似air做不到吧,如果能做到,那air就可以用来做病毒了 - -!   显然,adobe不会让你这么做的。 但C语言能完成这功能,于是乎,ANE的作用就出来了——把C和as打包起来,AS调用C来完成AS不能完成的任务。好吧,至于ANE还能干嘛,你们自己慢慢YY,下来我就开始写教程了。




以下教程是用在android手机上的:
      首先,在这个教程里要准备的工具:
1、flash cs6
2、flash builder 4.6 (低版本的没用过,不是很清楚);
3、adt打包工具(回复本帖就能下载哟,亲);
4、数字证书(就是用来签证的玩意,可以向adobe申请,也可以自己用flash cs6创建);

OK,东西准备好了吧? let's go!


一、创建jar文件
   .jar就是个java文件,android系统原生就是java来写的,所以我们想扩展android 上的air,就得有个jar文件来实现你要的功能。
1、先打开FB(就是flash builder,以后都叫它FB了)。建一个java项目。(文件-新建-其它-java项目|  file-new -other-java-java project)。然后,随便给它起个名字,完成。
QQ截图20121026000715.png 
  然后,看看项目目录,应该就是这个:
QQ截图20121026001909.png 
然后,对着项目点右键(就是对着myExtensonJava点右键),点击属性,再选java构建路径,然后选库路径、再选添加外部jar,再找到flash cs6目录下AIR3.2\lib\android\ 的FlashRuntimeExtensions.jar文件(properties—java built path—library—Add External JARs ——XXX目录下的FlashRuntimeExtensions.jar—打开—OK)
  如图:
QQ截图20121026003936.png 

然后,在项目的src文件下建一个包,包名自定,我这用的是com.three,接着再在这个包下建3个java类。先看看项目结构QQ截图20121026013806.png 
各JAVA代码如下:
1、Extension的代码
  1. package com.three;
  2. import com.adobe.fre.*;

  3. //Extension这个类是AS与JAVA交互的最基础的入口,其实很简单,也就这么点东西
  4. public class Extension implements FREExtension {


  5. @Override
  6. public FREContext createContext(String arg0) {
  7. // new一个新的threeExtensionContext出来;
  8. return new threeExtensionContext();
  9. }

  10. @Override
  11. public void dispose() {
  12. // 这个销毁资源的方法,暂时没有什么用,空着

  13. }

  14. @Override
  15. public void initialize() {
  16. // 初始化方法,暂时用不着,空着先

  17. }

  18. }
复制代码
2、threeExtensionContext的代码:
  1. package com.three;

  2. import java.util.*;

  3. import com.adobe.fre.FREContext;
  4. import com.adobe.fre.FREFunction;

  5. public class threeExtensionContext extends FREContext {

  6. public threeExtensionContext(){
  7. //这个貌似也用不着,空着
  8. }

  9. @Override
  10. public void dispose() {
  11. // 空着

  12. }

  13. @Override
  14. public Map<String, FREFunction> getFunctions() {
  15. // 下面这个比较关键,它的作用是定义as与JAVA具体方法通信的重要接口
  16. Map<String,FREFunction> functionMap=new HashMap<String,FREFunction>();
  17. functionMap.put("test",new test());
  18. return functionMap;
  19. }

  20. }
复制代码
3,test的代码:
  1. package com.three;

  2. import com.adobe.fre.FREContext;
  3. import com.adobe.fre.FREFunction;
  4. import com.adobe.fre.FREInvalidObjectException;
  5. import com.adobe.fre.FREObject;
  6. import com.adobe.fre.FRETypeMismatchException;
  7. import com.adobe.fre.FREWrongThreadException;

  8. public class test implements FREFunction {

  9. @Override
  10. //这个类作用就是 AS调用CALL方法给java传一个FREObject的参数组,然后,java给as返回一个FREObject
  11. public FREObject call(FREContext arg0, FREObject[] arg1) {
  12. // 定义方法的具体内容
  13. int a=0; //声明一个整形变量a

  14. FREObject b = null; //声明一个FREObject对象b,待会返回用的;
  15. try {
  16. a=arg1[0].getAsInt();//读取as传过来的整理参数并赋值给a;
  17. } catch (IllegalStateException e) {
  18. //不知道是啥 ,FB自己添加的
  19. e.printStackTrace();
  20. } catch (FRETypeMismatchException e) {
  21. //不知道是啥 ,FB自己添加的
  22. e.printStackTrace();
  23. } catch (FREInvalidObjectException e) {
  24. //不知道是啥 ,FB自己添加的
  25. e.printStackTrace();
  26. } catch (FREWrongThreadException e) {
  27. //不知道是啥 ,FB自己添加的
  28. e.printStackTrace();
  29. }



  30. try {
  31. b=FREObject.newObject(a*100);//调用FREObject的静态方法把a这个整型变量写到b里去;
  32. } catch (FREWrongThreadException e) {
  33. // //不知道是啥 ,FB自己添加的
  34. e.printStackTrace();
  35. }

  36. //
  37. return b;//再返回b;
  38. }

  39. }
复制代码
最后,写完了,没有报错的话,就右键项目,点导出-java-jar文件。



二、创建SWC文件

      还是用FB,这次来创建swc库。至于什么是swc,自己去谷哥百度一下吧。

1、用FB,新建一个flex库项目(flex library)。就是  文件-新建-flex库项目。如果找不着,就 文件-新建-其它-flash builder --flex库项目。
QQ截图20121026015129.png 

2、写代码:
  1. package com.three
  2. {
  3. import flash.external.ExtensionContext;
  4. public class callJava
  5. {
  6. var context:ExtensionContext;
  7. public function callJava()
  8. {

  9. context=ExtensionContext.createExtensionContext("com.three.Extension","");

  10. }
  11. public function callJavaTest(value:int):int{
  12. var a:int;
  13. a=context.call("test",value) as int;
  14. return a;
  15. }
  16. }
  17. }
复制代码

OK,看看项目结构:

QQ截图20121026020546.png 

看到myExtension.swc了木有?   右键点击它,然后复制出来,跟刚才那个jar文件放在一起。
然后,复制一个myExtension.swc的副本,把它改成myExtension.zip,并解压到当前目录;

二、extension.xml 文件
extention.xml文件,上面定义了ane运行环境配置等乱七八遭的东西;
1、新建 一个文本文件,打开,粘入以下代码
  1. <extension xmlns="http://ns.adobe.com/air/extension/2.5">
  2. <id>com.three.Extension</id>
  3. <versionNumber>1</versionNumber>
  4. <platforms>
  5. <platform name="Android-ARM">
  6. <applicationDeployment>
  7. <nativeLibrary>myExtensionJava.jar</nativeLibrary>
  8. <initializer>com.three.Extension</initializer>
  9. <finalizer>com.three.Extension</finalizer>
  10. </applicationDeployment>
  11. </platform>
  12. </platforms>
  13. </extension>
复制代码
然后把这个文本文件改成extension.xml就行了,同样,把它跟jar 和swc放在一起。



四、签证 文件(P12)
   这个数字签证文件,要申请正式的挺麻烦的,还得花钱,并提供公司相关信息。不过还好,用flash可以自己创建开发版的。以下就是自己创建签证文件的过程;
1、打开flash,新建一个air项目(air for desktop 或是air forandroid 还是 air for ios 都可以);
2、文件—AIR 3.2 for XXX配置—签名—创建。。然后自己慢慢填吧,填好了保存出来,跟刚才创建的那一堆东西放在一起。



五、ADT打包
   注:此ADT可不是android的那个ADT。 这个ADT只是一个打包工具,文件是 adt.jar 。要使用它,你的电脑上还得安装java运行环境。这里就不写了,去谷哥百度一下,有很多教程。
这工具回复贴子有下载,下载完后同样把它放到刚才那个文件目录下,现在目录应该是这样子:
QQ截图20121026024050.png 
然后,在这个文件夹下按着shift键点鼠标右键,在弹出的菜单里选 : 在此处打开命令窗口 。
QQ截图20121026024403.png 

然后就开始输入指令吧。这玩意是命令行工具,我就直接把命令粘下来了
java -jar adt.jar -package -tsa none -storetype pkcs12 -keystore a.p12 -storepass 123 -target ane m.ane extension.xml  -swc myExtensionAs.swc -platform Android-ARM library.swf myExtensionJava.jar

这命令其实挺简单的,无非就是打个包嘛....
不过有几个地方要注意。一个  -tsa none   ,这个在很多教程里都没有写这句,在你们那不知道,反正在我这如果不写会报一个时间戳的错,因为如果不写,adt打包会连接一个国外的网站获得时间戳,但人家那国外网站不让天朝子民访问,所以报错。解决方法就是让它别写时间 戳,也就是加 -tsa none。  要么用fanqiang软件也行。随意;


我现在是生成了一个叫m.ane的文件了,不知道你们生成没有

OK,现在可以写代码来测试了:

1、用flash cs6 新建一个air for android项目;
2、打开文件—actionScript设置—库路径—点击(浏览到本机扩展(ANE)文件)—找到我们生成的那个ANE文件
QQ截图20121026030847.png 
点确定。

3、在flash面板上,点击 窗口,然后 组件。打开组件面板,拖两个textArea和一个button 到舞台上。 这两个textArea分别命名为txt1和txt2   button命名为 btn
如图:
QQ截图20121026031421.png 

4、按F9键打开动作面板 ,输入代码:

  1. import com.three.callJava;
  2. import flash.events.MouseEvent;
  3. var con:callJava=new callJava();
  4. btn.addEventListener(MouseEvent.CLICK,onClick);
  5. function onClick(e){
  6. var cj:callJava=new callJava();
  7. var a:int=int(txt1.text);
  8. var b:int=cj.callJavaTest(a);
  9. txt2.text=b.toString();
  10. }
复制代码
想要看效果,在Windows下是不行的,必须要连上android手机,然后在AIR 3.2 for android 设置里 部署面板上选上 发布以后在连接的android设置运行程序。当然,签名证书也要填上的哟。另外一点是 ,手机上要安装air。。如果手机不想装air,也可以,同样,在布署面板里 勾选 将air运行时嵌入应用程序。

    然后点发布就可以测试效果了。如果发布的时候提示版本错误,那就回到 flex库项目那,把那个myExtensinAs项目的flex库编辑器的 附加的编译器参数里 加上 -swf-version=11
QQ截图20121026033548.png 



OK,最终运行结果呢,因为是在手机上,不好截图,就不展示了... 
大概意思呢就是,屏幕上有两个文本框,在上面那个文本框里输入一个整数,然后点击按钮,下面那个文本框就会输出上面那个文本框的10倍的整数。
   虽然这功能相当简单,而且,根本用不着这么复杂的方法。不过,我这只是一个抛砖引玉的作用,到底ANE能干嘛,有待兄弟们慢慢发掘。
0 0
原创粉丝点击