ios/android代码生成FLASH可用的actionscript代码(*.ane)

PS:最近因为工做缘由,须要把现有的Android+IOS工程转成flash air可用的工程,简单来讲就是把ios+android 转换成anehtml

欢迎各类转载,转载请注明出处java

微信:coderbook  android

gitHub:https://github.com/coderbookios

blog:http://www.coderbook.netgit

开发环境:github

  一、操做系统:Windows/MacOX/Linux 本文以MacOX10.9为例macos

  二、开发环境(IDE):Xcode6.1+FlashBuilder4.6vim

  三、SDK:IOS8.0以上,AdobeAirSDK16+xcode

1、概述bash

  1)AdobeAirSDK安装

  2)使用FlashBuilder建立actionscript library项目(以TalkingData Adtracking项目为例)

  3)利用xcode建立actionscript调用ios代码的中间项目

  4)建立actionscript调用android代码的中间工程

  5)导出各项目,放在相应的目录中,并编写相应配置文件

  6)使用airsdk命令编译生成*.ane项目

  7)建立使用调用ane代码的demo

  8)编译android版本生成apk

  9)建立ios版本生成ipa

2、AdobeAirSDK安装

  1)下载以后开始安装,在mac ox的安装路径以下:~/AIRSDK_Compiler

  2)配置环境变量。vim ~/.bash_profile 添加以下内容:export PATH=$PATH:/Users/vernon/AIRSDK_Compiler/bin

  3)退出保存。

  4)打开Command(命令行工具),运行adt -version查看是否配置正确。

  

  5)安装完成

  6)QA 

3、使用FlashBuilder建立actionscript library项目

  1)下载和安装FlashBuilder(个人版本是4.6)

  2)下载TalkingData SDK Tdtracking版本。ios版本 android版本

  3)打开FlashBuiler建立ActionScript library项目,packagename命名为com.talkingdata.sdk

    3.1 打开TalkingDataAdtracking SDK 查看可使用的接口,如下方法都是咱们要封装的接口

    

     3.2 建立TalkingDataAdTracking类。添加引用 import flash.external.ExtensionContext (actionScript就是经过这个类来实现与ios和android代码进行通讯的)而且建立 extContext=ExtensionContext.createExtensionContext("com.talkingdata.sdk",null);

    

    

    

    3.3 对于extContext.call(functionName,TalkingDataAneFunction.AdTracking_init,...);方法的说明:extContext.call方法第一个参数是方法名,这里我们以前定义的  

//函数名称,之后的调用都是过这个方法名来传递的
public static const functionName:String="TalkingDataFunctions";

    第二个参数用来标识,调用的是TalkingDataAdtracking的哪一个方法,如上面init方法里的AdTracking_init方法;

    剩下的参数是调用TalkingData Adtracking SDK 所须要的参数。

    3.4 剩下的方法实现,能够参数源码 gitHub

4、利用xcode建立actionscript调用ios代码的中间项目

  1)从官网下载FlashRuntimeExtensions.h(也能够从个人github地址下载)文件,这是一个C写的与actionscript交互的代码

  2)建立一个名称为TalkingDataSDKIOSLib的ios library项目,而且添加对FlashRuntimeExtensions.h和TalkingData SDK的引用

  如图:

    

  3)建立名称为TalkingDataSDKIOSLib.h和TalkingDataSDKIOSLib.m的调用类,如上图所示。

  4)添加引用而且定义与actionscript中相同值的方法类型(int类型)

    

  5)添加Initializer和Finalizer方法(参数是固定格式)

void TalkingDataSDKContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet){
    *numFunctionsToTest=1;
    FRENamedFunction *func=(FRENamedFunction*)malloc(sizeof(FRENamedFunction) * 1);
    func[0].name=(const uint8_t*)"TalkingDataFunctions";
    func[0].functionData=NULL;
    func[0].function=&TalkingDataSDKFunctions;
    *functionsToSet=func;
    
}

void TalkingDataSDKContextFinalizer(FREContext ctx){
    
}

void TalkingDataSDKExtensionInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet){
    extDataToSet=NULL;
    *ctxInitializerToSet=&TalkingDataSDKContextInitializer;
    *ctxFinalizerToSet=&TalkingDataSDKContextFinalizer;
}

  6)如上面代码所示,最终的调用函数都指向了TalkingDataSDKFunctions这个方法(也是固定参数),因此添加方法

FREObject TalkingDataSDKFunctions(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){
  ...      
}

   7)

 5、建立actionscript调用android代码的中间工程

  1)用FlashBuilder(用eclipse或者android studio均可以)建立名称为TalkingDataSDKJava项目,而且添加package:com.talkingdata.sdk.flashair。

  2)添加须要使用jar包

    2.1 添加talkingdata sdk和FlashRuntimeExtensions.jar(adobe 封装的jar包)的引用。

    2.2 添加android的依赖包(/Users/vernon/android-sdk-macosx/platforms/android-18/andorid.jar)(eclipse或者android studio 不须要添加这步)

  3)建立TalkingDataFunctions 继承FREFunction用来处理全部从actionscript传过来的方法。

public class TalkingDataFunctions implements FREFunction {

    TalkingDataSDKContext exContext=null;
    public TalkingDataFunctions(TalkingDataSDKContext exContext){
        this.exContext=exContext;
    }
    private String Tag="TalkingDataFunctions";
    @Override
    public FREObject call(FREContext arg0, FREObject[] arg1) {
        FREObject obj=null;
       .....
        .....
        return obj;
    }
}        

 

  4)建立TalkingDataSDKContext类继承FREContext

public class TalkingDataSDKContext extends FREContext{
    @Override
    public Map<String, FREFunction> getFunctions() {
        Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>();
        functionMap.put("TalkingDataFunctions",new TalkingDataFunctions(this));

        return functionMap;
    }

    @Override
    public void dispose() {
        
    }
}

  5)建立TalkingDataSDKExtension继承FREExtension类,并实现createContext方法:

@Override
    public FREContext createContext(String arg0) {
        TalkingDataSDKContext talkingDataContext = new TalkingDataSDKContext();
        return talkingDataContext;
    }

  6)具体调用TalkingData SDK的方法能够参考TalkingDataFunctions类的方式。

6、导出各项目,放在相应的目录中,并编写相应配置文件 

  1)建立名为TalkingDataSDKbuild的文件夹,用来存放全部须要的文件,而且在该文件夹中分别建立名为Android-ARM、iPhone-ARM、default三个文件夹。

  2)导出并生成必须的文件

    2.1 以jar包的形式导出“第五步”中建立的代码。名字为:anejava.jar 。

    2.2 利用jar命令把刚刚导出的talkingdataanejava.jar和talkingdata Adtracking sdk的jar合并成为一个jar,即talkingdataane.jar。{

       mkdir tmp

       cd tmp

       jar -xvf  ../anejava.jar 

       jar -xvf  ../talkingdata-sdk-xxx.jar

       jar -cvf  talkingdataane.jar .

      }

    2.3 导出在“第四步”中生成的.a库(xcode:先选择设备类型为IOS Device 而后再 command+B)在Products文件夹下libTalkingDataSDKIOSLib.a

    2.4 导出在“第三步”中生成的actionscript的库。在bin目录下的TalkingDataSDKAS.swc

   3)把相关的库放到对应的目录下面

    3.1 把talkingdataane.jar放在Android-ARM下面

    3.2 把libTalkingDataSDKIOSLib.a放在iPhone-ARM下面

    3.3 把TalingDataSDKAS.swc 放在TalkingDataSDKbuild文件夹下面。而且复制一份TalingDataSDKAS副本.swc把它修改为.zip,而后解压。

      打开解压后台的文件,把名字为library.swf的文件分别copy到Android-ARM、iPhone-ARM、default下面各一份。

      而后删除TalingDataSDKAS副本.zip和TalingDataSDKAS副本文件夹

   4)建立其它必要文件

    4.1 生成*.p12文件用于给ane签名

    4.2 建立extension.xml

<extension xmlns="http://ns.adobe.com/air/extension/16.0">
<!-- 这里与三-3.2中的字符串相同 -->
  <id>com.talkingdata.sdk</id>
  <versionNumber>1.0.0</versionNumber>
  <platforms>
<!--   Android-ARM  相对android的文件夹-->
    <platform name="Android-ARM">
      <applicationDeployment>
        <nativeLibrary>talkingdataane.jar</nativeLibrary>
        <!-- 这里是以前在android库中建立的类名 -->
        <initializer>com.talkingdata.sdk.flashair.TalkingDataSDKExtension</initializer>
        <finalizer>com.talkingdata.sdk.flashair.TalkingDataSDKExtension</finalizer>
      </applicationDeployment>
    </platform>
    <platform name="iPhone-ARM">
      <applicationDeployment>
        <nativeLibrary>libTalkingDataSDKIOSLib.a</nativeLibrary>
        <!-- 对ios库中TalkingDataSDKIOSLib里方式的名称 -->
        <initializer>TalkingDataSDKExtensionInitializer</initializer>
<finalizer>TalkingDataSDKContextFinalizer</finalizer>
</applicationDeployment>
 </platform> <platform name="default"> <applicationDeployment/> </platform> </platforms> </extension>

    4.3 在iPhone-ARM下建立platform.xml的文件

<platform xmlns="http://ns.adobe.com/air/extension/16.0">
    <sdkVersion>8.0</sdkVersion>
    <linkerOptions>
        <option>-w</option>
        <option>-ios_version_min 5.1.1</option>        
        <option>-framework AdSupport</option>
        <option>-framework Security</option>        
        <option>-framework CoreTelephony</option>
        <option>-lz</option>
    </linkerOptions>
</platform>

 

7、打开命令行,进入到TalkingDataSDKbuild目录下 执行:

  adt -package -storetype pkcs12 -keystore a.p12 -storepass wangying -target ane com.talkingdata.adtracking.ane extension.xml -swc TalkingDataSDKAS.swc -platform Android-ARM -C Android-ARM . -platform iPhone-ARM -C iPhone-ARM . -platform default -C default .

  生成com.talkingdata.adtracking.ane。到这里,其实,编写工做已经完成。

8、建立使用调用ane代码的demo

  1)建立名TalkingDataSDKDemo的Flex mobile项目。

  2)引用咱们刚刚建立好的com.talkingdata.adtracking.ane库。

 

  3)以生成的为ViewNavigatorApplication类型的application结构来讲。打开TalkingDataSDKDemo.mxml。在application_completeHandler方法中进行初始化:

  

  4)在TalkingDataSDKDemoHomeView.mxml页面添加添加一个按钮事件,调用onCreateRole方法,以下:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView">
    
    <fx:Script>
        <![CDATA[
            import com.talkingdata.sdk.TalkingDataAdTracking;
            protected function oncreateButton_click(event:MouseEvent):void
            {
                TalkingDataAdTracking.onCreateRole("rolename_td");
            }
        ]]>
    </fx:Script>
    
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Button x="122" y="87" label="Createrole" click="oncreateButton_click(event)"/>
</s:View>

  5)编辑TalkingDataSDKDemo-app.xml文件添加android必须的权限,而且修改TalkingDataSDKDemo-app.xml下面的命名空间为16.0

<android>
        <colorDepth>16bit</colorDepth>
        <manifestAdditions><![CDATA[
            <manifest android:installLocation="auto">
                <!--See the Adobe AIR documentation for more information about setting Google Android permissions-->
                <!--Removing the permission android.permission.INTERNET will have the side effect
                    of preventing you from debugging your application on your device-->
                <uses-permission android:name="android.permission.INTERNET"/>
                <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>-->
                <!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>-->
                <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>-->
                <uses-permission android:name="android.permission.INTERNET"/>
                <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
                <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
                <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
                <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
                <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
                <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
            </manifest>
            
        ]]></manifestAdditions>
    </android>
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<application xmlns="http://ns.adobe.com/air/application/16.0">
.....
</application>

 

  6)保存,而且拷贝bin目录下面*.xml和*.swf到TalkingDataSDKbuild目录下面

  7)运行以下脚本(或者使用flashbuilder导出)生成android可运行的apk

adt -package -target apk -storetype PKCS12 -keystore a.p12 -storepass wangying talkingdata-android-adtracking.apk TalkingDataSDKDemo-app.xml TalkingDataSDKDemo.swf -extdir .

   8)编译ios版本

    8.1 修改TalkingDataSDKDemo-app.xml的<iPhone></iPhone>部分,添加bundleId

<iPhone>
        <InfoAdditions><![CDATA[
            <key>com.talkingdata.sdk.aneDemo</key>
            <array>
                <string>1</string>
                <string>2</string>
            </array>
        ]]></InfoAdditions>
        <requestedDisplayResolution>high</requestedDisplayResolution>
    </iPhone>

    8.2 在ios开发者后台建立bundleId为com.talkingdata.sdk.aneDemo的开发者证书,如,命名为:anetrackingadhoc.mobileprovision

    8.3 运行如下脚本,生成ipa包:

adt -package -target ipa-test -provisioning-profile anetrackingadhoc.mobileprovision -storetype PKCS12 -keystore a.p12 -storepass wangying talkingdata-adtracking.ipa TalkingDataSDKDemo-app.xml TalkingDataSDKDemo.swf -extdir . -platformsdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk
相关文章
相关标签/搜索