守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1716|回复: 4

[Windows] 手把手教你创建一个windows下的AIR本机扩展程序(1)——创...

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

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

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

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

    开源英雄守望者

    发表于 2015-8-6 13:40:23 | 显示全部楼层 |阅读模式
    手把手教你创建一个windows下的AIR本机扩展程序(1)——创建dll


    需要生成一个AIR本机扩展程序需要以下几个步骤:
    • 一、编写本机扩展代码;
    • 二、编写extension.xml;
    • 三、编写AS端的扩展代码,并生成相应的swc文件;
    • 四、打包ANE;
    • 五、编写AS项目并使用ANE;



    一、编写本机扩展代码:
    环境:VS2010

    先在VS2010下新建一个win32的DLL工程,然后将flash builder安装目录下的sdk里面的
    FlashRuntimeExtensions.h(C:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\include)
    和FlashRuntimeExtensions.lib(C:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\lib\win)复制到工程所在文件夹下,
    并将其添加到工程中,见下图:



    然后就可以开始编写dll代码了。
    dll代码里面主要包括3个方面:

    • ExtensionInitializer以及ExtensionFinalizer函数
    • FREContextInitializer以及FREContextFinalizer函数
    • 可供AS调用的函数

    (前两点是必要的!)

    ps:各个函数的编写格式可以查看FlashRuntimeExtensions.h中的定义。

    .C文件:
    1. #include "MyExtension.h"

    2. //ext初始化函数
    3. void MyExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
    4. FREContextFinalizer* ctxFinalizerToSet) {
    5. extDataToSet = NULL;
    6. *ctxInitializerToSet = &MyContextInitializer;
    7.     *ctxFinalizerToSet = &MyContextFinalizer;
    8. }

    9. //ext终止函数
    10. void MyExtFinalizer(void* extData)
    11. {
    12. return;
    13. }

    14. //上下文初始化函数
    15. void MyContextInitializer(void* extData,const uint8_t* ctxType,FREContext ctx,
    16. uint32_t* numFunctionsToSet,const FRENamedFunction** functionsToSet)
    17. {
    18. *numFunctionsToSet = 1; //可供AS调用的函数个数

    19.     FRENamedFunction* func = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*(*numFunctionsToSet));//动态分配储存函数信息的内存空间
    20.     func[0].name = (const uint8_t*)"helloExtension";//该函数对对应AS调用的名称
    21.     func[0].functionData = NULL;
    22.     func[0].function = &helloExtension;//该函数实际指针
    23.      
    24.     *functionsToSet = func;
    25. }

    26. //上下文终止函数
    27. void MyContextFinalizer(FREContext ctx)
    28. {
    29. return;
    30. }

    31. //AS调用函数
    32. FREObject helloExtension(FREContext ctx,void* functionData,uint32_t argc,FREObject  argv[])
    33. {
    34. const char * String = "helloExtension";
    35. FREObject reObj;
    36. FRENewObjectFromUTF8(strlen(String)+1,(const uint8_t*)String,&reObj);
    37. return reObj;
    38. }
    复制代码



    .h文件
    1. #include "FlashRuntimeExtensions.h"
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <string.h>


    5. //对外部可见的dll接口函数
    6. extern "C" __declspec(dllexport) void MyExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
    7. FREContextFinalizer* ctxFinalizerToSet);

    8. extern "C" __declspec(dllexport) void MyExtFinalizer(void* extData);

    9. extern "C" __declspec(dllexport) FREObject helloExtension(FREContext ctx,void* functionData,uint32_t argc,FREObject  argv[]);



    10. void MyContextInitializer(void* extData,const uint8_t* ctxType,FREContext ctx,
    11. uint32_t* numFunctionsToSet,const FRENamedFunction** functionsToSet);

    12. void MyContextFinalizer(FREContext ctx);
    复制代码



    然后生成项目,就可以在项目的Debug文件夹中找到相应的dll文件了(谨记是sln所在文件夹的Debug)



    本文来自:http://blog.sina.com.cn/s/blog_6471e1bb01012c2k.html


    本帖子中包含更多资源

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

    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
    金币
    51753
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-8-6 13:41:45 | 显示全部楼层
    手把手教你创建一个windows下的AIR本机扩展程序(2)——extension.xml


    extension里面包含一个xml文件(描述性文件),用于extension里面的各种属性。当你开发你自己的extension时,你需要自行创建一个xml文件。下面是xml中需要写入的内容介绍:
          A、以namespace说明开头
        <extension xmlns="http://ns.adobe.com/air/extension/2.5">   
          B、接着是extension的ID和版本号
        <id>com.example.SampleExtension</id>
       <versionNumber>1.0.4</versionNumber>
          C、还有几个可供选择的标签(对识别extension很有用)[可省]
        <name>Sample Extension</name>
        <description>
          <text lang="en-US">This is a description.</text>
          <text lang="fr-FR">C'est une description.</text>
        </description>
        <copyright>Copyright 2011, Sample Inc.</copyright>
    (描述不需要被本地化(localized),但如果需要,name和copyright可以被本地化)[何谓本地化???]
          D、紧接着是列出此extension所支持的平台和各个平台的相关重要信息
        一个平台的application-bundled实现声明:相应的库的名称、加上一个初始化函数。(这个稍后再详细介绍),下面先看一个例子:
        <platforms>
          <platform name="Windows-x86">
            <applicationDeployment>
              <nativeLibrary>sample.dll</nativeLibrary>
              <initializer>InitSample</initializer>
            </applicationDeployment>
          </platform>
        对于device-bundled实现的声明就相对简单一点,因为设备已经识别到相关的库和方法:
        <platform name="Sample-ARM">
          <deviceDeployment/>
        </platform>
        E、最后,extension可以包含一个“默认”平台的实现。实现必须使用ActionScript,因为实际的平台是不知道。它必须面向app部署(因为该app的使用平台还不知道),因为有没有办法保证所有设备都能够绑定默认。它的代表在这样的描述:
          <platform name="default">
            <applicationDeployment/>
          </platform>
        </platforms>
    </extension>

    而在此实例中的extension.xml如下:
    1. <extension xmlns="http://ns.adobe.com/air/extension/2.5">
    2.     <id>be.ljf.MyExtension</id>
    3.     <versionNumber>1.0.0</versionNumber>
    4.     <platforms>
    5.         <platform name="Windows-x86"> <!--平台名称-->
    6.             <applicationDeployment>
    7.                 <nativeLibrary>MyExtension.dll</nativeLibrary> <!--填入相应的.dll文件名-->
    8.                 <initializer>MyExtInitializer</initializer> <!--dll中Ext初始化函数名-->
    9.                 <finalizer>MyExtFinalizer</finalizer> <!--dll中Ext终止函数名-->
    10.             </applicationDeployment>
    11.         </platform>
    12.     </platforms>
    13. </extension>
    复制代码


    守望者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
    金币
    51753
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-8-6 13:42:29 | 显示全部楼层
    手把手教你创建一个windows下的AIR本机扩展程序(3)——构建SWC


    具体的构建方法可以查看本博的 如何导出ane所需的swc地址:http://blog.sina.com.cn/s/blog_6471e1bb01012ard.html下面给出简单的描述以及代码:
    在flex库项目中新建AS类文件(包名为be.ljf.MyExtension),复制一下代码:
    1. package be.ljf.MyExtension
    2. {
    3. import flash.events.EventDispatcher;
    4. import flash.external.ExtensionContext;

    5. public class MyExtension extends EventDispatcher
    6. {
    7. private static var isInstantiated:Boolean = false;
    8. private static var context:ExtensionContext;
    9. public function MyExtension()
    10. {
    11. super();
    12. if(isInstantiated)
    13. return;
    14. try
    15. {
    16. context = ExtensionContext.createExtensionContext("be.ljf.MyExtension","");
    17. isInstantiated = true;
    18. }
    19. catch(e:Error)
    20. {
    21. }
    22. }
    23. public function helloExtension():*
    24. {
    25. return context.call("helloExtension");
    26. }
    27. }
    28. }
    复制代码


    然后构建项目,即可得到SWC文件



    守望者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
    金币
    51753
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-8-6 13:46:48 | 显示全部楼层
    手把手教你创建一个windows下的AIR本机扩展程序(4)——打包ANE


       首先先说一下打包ANE必须的部件:

    • ActionScript扩展库SWC
    • 本机扩展库
    • extension.xml(本机扩展的描述性文件)
    • library.swf(可以从SWC中解压得出)
    • .p12签名文件(可以使用任何一个由fl或者fb生成的.p12文件)
    • AIR3或以上的SDK

      

      下面详细描述一下ANE的打包步骤:

    1、先将要打包的文件放入同一个文件夹(上述的1~5)
    2、再将flash builder下的sdk下的bin、lib文件夹(我机子的路径:C:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0)复制到该文件夹中,如下图所示:




    (其中catalog.xml文件可省)
    2、运行命令行并将其路径设置到该文件夹路径上,然后键入:
    bin/adt -package -storetype pkcs12 -keystore .p12文件名称.p12 -storepass .p12文件的密码 -target ane 需要生成的ane的名称.ane extension.xml -swc swc名称.swc -platform 平台名称 library.swf 本机扩展库
    其中-platform有一下选项:
    Android-ARM.(大伙们说这里要有".")
    iPhone-ARM
    MacOS-x86
    Windows-x86


    输入后回车即可在该目录中自动生成所需的.ane文件
    下面提供一个完整的例子:





    3、打包ANE时可能遇到的错误:
    A、Java不是内部或外部命令,也不是批处理文件(这个请留意以前发的博客文章即可找到答案)
    B、Invalid swc file.The extension NameSpace requires the swf verison to be 13 or lower.(请留意“如何导出ane所需的swc”一文)
    C、Could not generate timestamp: handshake alert: unrecognized_name
        解决办法:在后面加入 -tsa none








    打包多个平台下的ANE:




    本帖子中包含更多资源

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

    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
    金币
    51753
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-8-6 13:48:08 | 显示全部楼层
    手把手教你创建一个windows下的AIR本机扩展程序(5)——测试


    新建一个flex桌面项目,在构建路径中选择本机扩展,将之前生成的.ane文件添加进去,如下图:




    然后在mxml文件中编写下面的代码:
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
    3.   xmlns:s="library://ns.adobe.com/flex/spark"
    4.   xmlns:mx="library://ns.adobe.com/flex/mx"
    5.   applicationComplete="applicationCompleteHandler(event)">
    6. <s:layout>
    7. <s:VerticalLayout paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"/>
    8. </s:layout>
    9. <fx:Script>
    10. <![CDATA[
    11. import be.ljf.MyExtension.MyExtension;
    12. import mx.events.FlexEvent;
    13. private var ext:be.ljf.MyExtension.MyExtension;
    14. protected function applicationCompleteHandler(event:FlexEvent):void
    15. {
    16. ext = new be.ljf.MyExtension.MyExtension();
    17. trace("application complete");
    18. }
    19. protected function clickHandler(event:MouseEvent):void
    20. {
    21. outputField.text = ext.helloExtension();
    22. //outputField.text = String(ext.testUint(12));
    23. trace("click handler");
    24. }
    25. ]]>
    26. </fx:Script>
    27. <fx:Declarations>
    28. <!-- Place non-visual elements (e.g., services, value objects) here -->
    29. </fx:Declarations>
    30. <s:TextInput id="outputField" width="100%"/>
    31. <s:Button width="100%" label="Button" click="clickHandler(event)"/>
    32. </s:WindowedApplication>
    复制代码



    运行,即可看到效果~


    本帖子中包含更多资源

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

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

    使用道具 举报

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

    本版积分规则

    
    关闭

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

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

    GMT+8, 2019-10-19 16:05 , Processed in 0.049801 second(s), 37 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

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