守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1584|回复: 7

[Android] AIR Native Extension on Android - Hello World

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51792
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-10 20:30:48 | 显示全部楼层 |阅读模式
    简介

    AIR3刚刚发布,带来的最令人激动的新特性莫过于Native Extension了。Native Extension就是让AIR可以调用各个平台上的本地代码(native code, ios上的object-candroid上的javadesktop上的c++c#),从而完成对AIRActionscript API的自定义扩展。即可以让开发者通过编写基于平台的本地代码扩展ActionScript。从而完成一些原有Actionscript无法完成的功能。

    众所周知,AIRFlash平台的一个重要组成部分。其优势在于显示和渲染,开发者可以使用ActionScript或者Flex快速高效的开发出有良好用户体验的RIA应用。但是对于一些高性能的运算和对特定硬件设备的调用,AIR由于自身的限制而无法实现。

    AIR 2中引入的NativeProcess的概念,从而让AIR可以再桌面平台可以启动一个本地进程以协助AIR实现更多功能,AIR程序和NativeProcess的进程之间使用标准输入输出流(stdin,stdout,stderr)进行通信。这里需要说明一点,NativeProcesswindows上只能启动exe,在mac上只能启动dmg。其他任何格式的文件都无法启动。官方文档里的范例启动了一个.py文件,经过实验是无法运行的,只能是启动python里的python.exe,然后参数跟上相应的.py文件的路径,才能正确的执行python脚本。NativeProcess大大扩展了AIR在桌面上的应用开发能力。

    AIR 2.6开始,AIR开始支持移动平台,包括AndroidiOS。在移动设备上,由于设备和操作系统的种种限制,NativeProcess就无法工作了。由于移动设备的CPU普遍比桌面的CPU主频要低很多,因此对程序的性能要求更高。同时不同的移动设备的硬件设施各不相同(如陀螺仪,前后摄像头,GPS)AIR也无法完整及时的提供所有硬件设备的API,因此,为了让AIR能更好的适应移动平台的开发,急需要一种让AIR在移动设备上执行本地代码的解决方案。从而NativeExtension应运而生。

    最初引入Native Extension的版本是AIR 2.5 for TV。引入的目的主要是由于TV有很多特性不可能被AIR原生API所支持,如操纵电视频道。因此adobeAIR 2.5 for TV中加入了NativeExtension这个特性,让AIRTV上可以执行TV的本地代码从而更好的适应TV的开发。

    随着AIR在越来越多的平台上被支持,NativeExtension所带来的优势越来越明显,所以AdobeAIR3中将这个特性扩展到了所有的平台上。注意,是所有平台而不仅仅是移动平台,在桌面上也是可以使用NativeExtension的。

    NativeExtension VS NativeProcess

    NativeExtensionNativeProcess的主要区别在于,NativeProcess是新开一个进程完成相应的工作,而NativeExtensionAIR直接执行相应的本地代码,然后将结果返回给AIR。所有工作都在AIR本进程中完成。NativeExtension是让开发者自己扩展ActionScriptAPI,在ActionScript与底层代码之间建立了一个桥接,让开发基于系统的底层代码来扩展ActionScript

    NativeExtension VS Alchemy

    Alchemy也是flash平台扩展的一大利器,NativeExtensionAlchemy的主要区别在于, Alchemy是将C/C++代码编译为AVM可以执行的字节码,并生成一个相应的swc文件从而完成对Flash 平台的扩展,由于是编译为AVM可执行的字节码,因此Alchemy适用于Flash PlayerAIRNativeExtension是将本地代码打包进ane文件,并且提供了从Actionscript到本地代码的桥接,真正执行本地代码的还是操作系统本身而非AVM。而且NativeExtension只适用于AIR而不适用于Flash Player

    简单的来说,AIR NativeExtension就是一个带有本地代码实现的SWC库文件。

    组织结构

    本文首先介绍NativeExtension的结构和实现原理,然后以最简单的Hello World为例,介绍如何进行NativeExtension的开发,最后介绍如何使用AIR3SDK进行NativeExtension项目的打包和部署。


    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51792
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-10 20:32:04 | 显示全部楼层
    NativeExtension结构及原理

    一个NativeExtension项目主要有两个部分组成:As 端的库项目和底层代码的实现项目。我们以Android 上的NativeExtension为例,对一个NativeExtension项目进行讲解,下图是整个NativeExtension项目的体系结构。






    一个NativeExtension项目主要分为两个部分, AS库和本地实现。

    Actionscript 库项目

    AS库项目部分,开发者会定义需要自己需要扩展ActionscriptAPI,这些API的具体实现会映射到相应的Java代码。

    AS库项目部分最核心的类就是ExtensionContextExtensionContext负责与Java代码的交互。ExtensionContext会调用createExtensionContext方法创建和初始化Java端的本地代码。ExtensionContextcall方法可以调用具体的Java代码并获得返回结果。同时Extension还会接受从java代码抛出的事件。

    Java项目

    Java实现部分需要引入AIR SDK中的FlashRuntimeExtensions.jar进行开发,下文地道的FREExtensionFREContextFREFunctionden类和接口包含在FlashRuntimeExtensions.jar这个jar包中。

    FREExtensionjava端自定义代码的入口。FREExtension是一接口,需要用户重写createContext方法从而获得本地代码的上下文。AS库项目部分的ExtensionContextcreateExtensionContext方法就会调用FREExtensiongetContext方法从而获得Java代码的上下文。这个调用由AIR Runtime完成,不需要我们关心。

    FREContext是是本地扩展的具体内容的提供者。我们需要重写getFunctions方法,从而返回本地扩展的具体的实现函数。同时FREContext也会提供一些与app相关的API以方便开发,具体请参考官方文档,下图是一些开发中常用的api


    FREFunction是本地方法的具体实现。FREFunction是一个接口,提供了call方法。在AS端的ExtensionContext中调用的call方法都会映射到具体的FREFunctioncall方法。

    FREContextgetFunctions函数会返回一个Map,其key为一个自定义的Stringvalue是具体的FREFunction。通过getFunction方法。AIR Runtime通过getFunctionAS端的call(key,args)方法和java端具体的FREFunctionscall(args)方法进行映射。如下图所示


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51792
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-10 20:34:49 | 显示全部楼层
    开发准备Flash Builder 4.5 with AIR 3 SDK

    AIR3 SDK下载:http://www.adobe.com/special/products/air/sdk/

    不得不说这个链接隐藏的很好。找了好久才找到- =!。下载后解压,覆盖原有的SDK即刻

    Eclipse with Android SDK

    Native Extension - Hello World
    下面我们以Android上的NativeExtension开发为例,实现一个最简单的hello worlddemo
    整个Hello World项目会分成三部分:Android项目,Flex Library库项目和Flex Mobile项目。其中Android项目和Flex Library库项目构成了NativeExtension项目,Flex Mobile

    Android
    Android部分主要是java的开发,所需要用到的类库和相应的类会在下面的步骤中详细讲解。
    1. eclipse中新建一个Android项目,设置好包名,注意不要勾选创建Activity。值得注意的是,Android AIR app与其他的Android App有所不同。 Android AIR app只有一个Activity,所以这里不需要创建Activity。而且在AIR NativeExtension项目中,我们只使用android的一些本地代码而非android的项目,因此,android项目中的AndroidManifest.xml不会被应用到最终的AIR app中。AIR app中的AndroidManifest.xmlAIR根据app-xml自动生成。

    2. 将项目的类型设为Library型
    右击项目,选择Properties
    选中Android标签,勾选is Library

    3. 导入NativeExtension所需的Jar包
    Jar包位置
    在properties面板中,选择Java Build Path,在Libraries tab中点击Add Extension JARs,在对话框中选中AIR SDK中 FlashRuntimeExtensions.jar
    4. 设定src/gen下的代码不会被包括在项目中。
    在Properties面板中的Java Build Path里进入Source tab。在/gen中选中Included,点击Edit按钮
    添加一个nothing的Inclusion pattern
    5. 在项目中添加相应的Java实现代码
    HelloContext.java代码:
    1. package net.sswilliam.ane.helloworld;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import com.adobe.fre.FREContext;
    5. import com.adobe.fre.FREFunction;
    6. public class HelloContext extends FREContext {
    7.     public static final String HELLO_WORLD_FUNCTION ="hello_world_function";
    8.     @Override
    9.     public void dispose() {
    10.        // TODO Auto-generated method stub
    11.     }
    12.     @Override
    13.     public Map getFunctions() {
    14.        // TODO Auto-generated method stub
    15.        Map map = new HashMap();
    16.        //将函数和自定义字符串进行映射
    17.        map.put(HELLO_WORLD_FUNCTION, newHelloWorldFunction());
    18.        return map;
    19.     }
    20. }
    复制代码

    HelloExtension代码:
    1. package net.sswilliam.ane.helloworld;
    2. import com.adobe.fre.FREContext;
    3. import com.adobe.fre.FREExtension;
    4. public class HelloExtension implements FREExtension {
    5.     public FREContext createContext(String arg0) {
    6.        // TODO Auto-generated method stub
    7.        return new HelloContext();
    8.     }
    9.     public void dispose() {
    10.        // TODO Auto-generated method stub
    11.     }
    12.     public void initialize() {
    13.        // TODO Auto-generated method stub
    14.     }
    15. }
    复制代码

    HelloWorldFunction代码

    1. package net.sswilliam.ane.helloworld;
    2. import com.adobe.fre.FREContext;
    3. import com.adobe.fre.FREFunction;
    4. import com.adobe.fre.FREObject;
    5. public class HelloWorldFunction implements FREFunction {
    6.     public FREObject call(FREContext arg0, FREObject[] arg1) {
    7.        // TODO Auto-generated method stub
    8.        FREObject result = null;
    9.        try{
    10.            result = FREObject.newObject("hello "+arg1[0].getAsString());
    11.            //注意参数是一个FREObject数组,需要进行强制转换
    12.        }catch (Exception e) {
    13.            // TODO: handle exception
    14.        }
    15.        return result;
    16.     }
    17. }
    复制代码

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51792
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-10 20:37:55 | 显示全部楼层
    Flex Library

    1.       新建一个Flex Library项目,注意指定AIR3SDK,并且勾选“包括Adobe AIR库”





    2.       Flex Library中添加相关代码。


    HelloWorldExtension代码:

    1. package net.sswilliam.ane.helloworld
    2. {
    3.     import flash.external.ExtensionContext;
    4.     public class HelloWorldExtension
    5.     {
    6.         public static const HELLO_WORLD_FUNCTION:String ="hello_world_function";//与java端中Map里的key一致
    7.         public static const EXTENSION_ID:String ="net.sswilliam.ane.helloworld";//与extension.xml中的id标签一致
    8.         private var extContext:ExtensionContext;
    9.         public function HelloWorldExtension()
    10.         {
    11.             extContext = ExtensionContext.createExtensionContext(EXTENSION_ID,"");
    12.             //第二个为参数,会传入java代码中的FREExtension的createContext方法
    13.         }
    14.         public function hello(name:String):String{
    15.             if(extContext){
    16.                 return extContext.call(HELLO_WORLD_FUNCTION,name) asString;
    17.             }
    18.             return "call failed";
    19.         }
    20.     }
    21. }
    复制代码

    3.       添加extension.xml描述文件,将as项目和java代码进行绑定


    extension.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <extension xmlns="http://ns.adobe.com/air/extension/2.5">
    3.   <id>net.sswilliam.ane.helloworld</id>
    4.   <versionNumber>1</versionNumber>
    5.   <platforms>
    6.     <platform name="Android-ARM">
    7.       <applicationDeployment>
    8.         <nativeLibrary>HelloWorld.jar</nativeLibrary>
    9.         <initializer>net.sswilliam.ane.helloworld.HelloExtension</initializer>
    10.         <finalizer>net.sswilliam.ane.helloworld.HelloExtension</finalizer>
    11.       </applicationDeployment>
    12.     </platform>
    13.   </platforms>
    14. </extension>
    复制代码

    注意namespace2.5ID标签与ascreateExtensionContext函数里的id参数相同。同时指定目标平台,需要绑定的jar包等相关信息。


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51792
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-10 20:40:08 | 显示全部楼层
    App

    1.       新建一个Flex Mobile项目


    由于们的项目比较简单,不需要做过多的设置,直接一路next直到最后一步“构建路径”,点击添加项目,将我们刚才开发的Flex Library项目添加到我们的app项目中。


    2.       在项目中添加相应代码


    HelloWorld.mxml代码:

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
    3.                xmlns:s="library://ns.adobe.com/flex/spark" creationComplete="init(event)">
    4.    
    5.     <fx:Script>
    6.         <![CDATA[
    7.             import mx.events.FlexEvent;
    8.            
    9.             import net.sswilliam.ane.helloworld.HelloWorldExtension;
    10.            
    11.             private var helloExt:HelloWorldExtension;
    12.             protected function button1_clickHandler(event:MouseEvent):void
    13.             {
    14.                 // TODO Auto-generated method stub
    15.                 this.output.text = helloExt.hello(this.input.text);//调用
    16.             }
    17.            
    18.             protected function init(event:FlexEvent):void
    19.             {
    20.                 // TODO Auto-generated method stub
    21.                 helloExt = new HelloWorldExtension();//创建extension
    22.                
    23.             }
    24.            
    25.         ]]>
    26.     </fx:Script>
    27.    
    28.     <fx:Declarations>
    29.         <!-- 将非可视元素(例如服务、值对象)放在此处 -->
    30.     </fx:Declarations>
    31.     <s:Button x="370" y="10" label="按钮" click="button1_clickHandler(event)"/>
    32.     <s:TextInput x="16" y="20" width="337" id="input" text="william"/>
    33.     <s:Label x="21" y="88" width="429" id="output" text=""/>
    34. </s:Application>
    复制代码

    3.       编辑app-xml文件,添加extensions标签,申明需要使用的NativeExtensionID


    Extensions代码:

    1. <extensions>
    2.         <extensionID>net.sswilliam.ane.helloworld</extensionID>
    3.     </extensions>
    复制代码

    这样,所有的开发工作就完成了。


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51792
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-10 20:41:05 | 显示全部楼层
    打包构建

    代码写完了,我们需要把项目中所有的代码组合在一起,才能完成一个完整的app。说实话,AIR NativeExtension目前打包的过程是相当繁琐的,希望大家仔细阅读每个步骤。

    创建签名文件

    1.       随便选取一个AIR项目右击,选择导出


    2.       选择Flash Builder,发行版,点击下一步


    3.       随便选择一个路径后点击下一步


    4.       在数字签名tab中点击创建按钮


    5.       将必填内容都填好后点击确定,创建签名证书完毕




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51792
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-10 20:43:01 | 显示全部楼层
    创建ane

    首先,我们需要创建一个ane文件,ane就是NativeExtension的库文件,我们可以把它理解为带有本地java代码的swc文件。

    1.       android项目中的bin文件夹下的.class文件导出jar包,注意jar包的名字要和我们之前在Flex Libraryextension.xml中指定的名字一致。


    Jar包打包命令 :


    1. jar cf HelloWorld.jar –C bin .
    复制代码

    2.       随便新建一个目录作为工作目录,将Flex Library项目中自动生成的.swc文件复制到目录下,一共复制两份,并且将extension.xml也复制到工作目录下。



    3.       将被重命名的.swc副本更改后缀名为.zip,并解压,得到library.swfcatalog.xml文件



    4.       在工作目录下新建Android-ARM目录


    5.       将之前打包的.jar文件和解压得到的catalog.xmllibrary.swf文件都复制到Android-ARM目录下


    6.       将创建的数字证书复制到我们的工作目录下,并删除解压的文件和重复的.swc副本


    7.       在工作目录下,使用AIR3 SDK中的adt打包ane



    Adt打包ane的帮助可以再命令行中使用adt命令获得,其语法基本和打包其他文件相同,主要是注意打包出的ane文件名需要和之前设定的NativeExtensionID

    一直,如我们之前设定的IDnet.sswilliam.ane.helloworld,那么我们打包出的ane的全面就是net.sswilliam.ane.helloworld.ane, 还有要注意的是由于们打包的是Android系统,因此-platform需要为Android-ARM

    这样我们就获得了ane文件。

    Ane 打包命令:

    1. "C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\4.5.0-air3.0\bin\adt" -package -storetype PKCS12 -keystore sswilliam.p12 -storepass sswilliam -target ane net.sswilliam.ane.helloworld.ane extension.xml -swc *.swc -platform Android-ARM -C Android-ARM .
    复制代码

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51792
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-10 20:45:34 | 显示全部楼层
    打包apk1.       新建一个工作目录,将Flex Mobile项目中bin-debug下的swf文件和app.xml文件复制到工作目录下。

    2.       将之前生成的签名文件和ane文件都复制到工作目录下

    3.       在工作目录下使用AIR3 SDK中的adt打包

    打包跟平常的apk打包相同,只是在最后加上了-extdir,从而可以获得ane文件。

    app打包脚本:

    1. "C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\4.5.0-air3.0\bin\adt" -package -target apk -storetype PKCS12 -keystore sswilliam.p12 -storepass sswilliam HelloWorld.apk HelloWorld-app.xml HelloWorld.swf -extdir .
    复制代码



    最后安装到手机进行测试,注意收集要下载AIR3 runtime

    最后再提提醒,打包过程还是非常复杂的。很容易出现各种各样的问题,切记切记。

    由于现在还没有很好的IDE来进行NativeExtension开发,因此NativeExtension的程序只能在真机上进行调试。所以每次都需要打包,很麻烦,因此我提供了一个python的打包脚本,双击一下就可以完成所有打包步骤。可以大大提高开发效率。使用python2.7运行,按照注释更改相应的参数即可,打包脚本如下:

    1. #!/usr/bin/env python
    2. import os
    3. import shutil
    4. import zipfile
    5. import sys


    6. def executeCMD(path,cmd):
    7.     cdcmd = 'cd /d '+os.getcwd()
    8.     if path != '':
    9.         cdcmd = cdcmd+'\\'+path;
    10.     cmdfile = file('exec.bat','w')
    11.     cmdfile.write(cdcmd);
    12.     cmdfile.write('\n')
    13.     cmdfile.write(cmd)
    14.     cmdfile.close()
    15.     os.system('exec.bat')
    16.     print 'end'


    17. print os.getcwd()
    18. #the path of the adt
    19. ADT = r'C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\4.5.0-air3.0\bin\adt.bat'

    20. #the path of the java project
    21. javaSRC = r'C:\ane\anejava\HelloWorld'

    22. #the path of the flex library project
    23. swcSRC = r'C:\ane\aneflex\HelloWorldFlexNE'

    24. #the path of the app project
    25. appSRC = r'C:\ane\aneflex\HelloWorld'

    26. #the name of the jar package
    27. jarName = 'HelloWorld'

    28. #the name of the swc package
    29. swcName = 'HelloWorldFlexNE'

    30. #the name of the app
    31. appName = 'HelloWorld'

    32. #the extension id
    33. extensionID = 'net.sswilliam.ane.helloworld'

    34. #the name of the licence
    35. licenceName = 'yizhai.p12'

    36. #the password of the licence
    37. password = 'your password'

    38. if os.path.exists(r'java'):
    39.     shutil.rmtree(r'java')
    40. if os.path.exists(r'swc'):
    41.     shutil.rmtree(r'swc')
    42. if os.path.exists(appName+'.swf'):
    43.     os.remove(appName+'.swf')
    44. if os.path.exists(appName+'-app.xml'):
    45.     os.remove(appName+'-app.xml')


    46. os.mkdir(r'java')
    47. os.mkdir(r'swc')
    48. os.mkdir(r'swc\Android-ARM')

    49. print 'copy files'
    50. shutil.copytree('\\'.join([javaSRC,'bin']),r'java\bin')

    51. shutil.copyfile(swcSRC+'\\src\\extension.xml',r'swc\\extension.xml')
    52. shutil.copyfile(swcSRC+'\\bin\\'+swcName+'.swc',r'swc\\'+swcName+'.swc')

    53. shutil.copyfile(appSRC+'\\bin-debug\\'+appName+'.swf',appName+'.swf')
    54. shutil.copyfile(appSRC+'\\bin-debug\\'+appName+'-app.xml',appName+'-app.xml')
    55. print 'end copy files'

    56. print 'generate jar'
    57. aneID = 'com.adobe.g11n.ZxingNE'
    58. print '\\'.join([javaSRC,'bin'])
    59. #shutil.
    60. #shutil.copytree
    61. PackageJarCMD = 'jar cf '+jarName+'.jar -C bin .'
    62. executeCMD('java',PackageJarCMD)
    63. print 'end cmd jar'


    64. print 'generate ane'
    65. swcZip = zipfile.ZipFile('swc\\'+swcName+'.swc',mode='r')
    66. filelist = swcZip.namelist()
    67. for zipName in filelist:
    68.     file('swc\\Android-ARM\\'+zipName,'wb').write(swcZip.read(zipName))
    69.    
    70. shutil.copyfile('java\\'+jarName+'.jar','swc\\Android-ARM'+jarName+'.jar')

    71. shutil.copyfile('java\\'+jarName+'.jar','swc\\Android-ARM\\'+jarName+'.jar')
    72. shutil.copyfile('yizhai.p12','swc\\yizhai.p12')
    73. PackageAneCMD = '"'+ADT+'" -package -storetype PKCS12 -keystore '+licenceName+' -storepass '+password+' -target ane '+extensionID+'.ane extension.xml -swc *.swc -platform Android-ARM -C Android-ARM .'
    74. executeCMD('swc',PackageAneCMD)

    75. print 'end generate ane'

    76. print 'package apk'
    77. shutil.copyfile('swc\\'+extensionID+'.ane',extensionID+'.ane')
    78. PackageAPKCMD = '"'+ADT+'" -package -target apk -storetype PKCS12 -keystore '+licenceName+' -storepass '+password+' '+appName+'.apk '+appName+'-app.xml '+appName+'.swf -extdir .'
    79. executeCMD("",PackageAPKCMD)
    80. print 'end package apk'
    81. #shutil.copytree
    复制代码

    本系列文章来自:http://sswilliam.blog.163.com/blog/static/189696383201191094227313/


    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-11-20 16:51 , Processed in 0.067288 second(s), 35 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表