守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1623|回复: 0

[Windows] AIR Native Extension c++ 鼠标全局坐标 配置环境到发布全程讲解

[复制链接]
  • TA的每日心情
    慵懒
    2016-8-19 16:03
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    1

    主题

    4

    帖子

    4259

    积分

    中尉

    Rank: 7Rank: 7Rank: 7

    威望
    0
    贡献
    16
    金币
    117
    钢镚
    10
    发表于 2015-1-11 16:33:52 | 显示全部楼层 |阅读模式
    本帖最后由 水玲珑 于 2015-1-11 17:02 编辑

    最下面项目附件:

    发现ane的c++例子挺少的。 而且在自己尝试的过程中也出现了各种各样的问题。在此顺便当做自己的学习笔记。把从头至尾的全过程都记录下来了。也方便大家学习。

    备注:有些东西是个人理解或者信息来源不准确,所以如果哪位大侠发现问题还请海涵并及时指出。

    准备活动:
    1 vs2010(我用的是2010,随便什么版本都行。下面我的讲解会以此版本为主)
    2 jdk 需要配置好环境变量。
    3 flex sdk 需要配置好环境变量。(同配置jdk一样,例如:我的sdk中bin文件夹的目录是"D:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\bin" 那就将这个这个路径添加的环境变量的path中 不用双引号。)

    下面从c++部分开始讲解:
    1.创建c++ 空项目
    2.将FlashRuntimeExtensions.h(在flex sdk的include文件夹下)和FlashRuntimeExtensions.lib(在flex sdk的lib\win文件夹下)两个文件拷贝到刚才新建的项目工程里。如图:




    将这两个拷贝后的这两个文件分别拖入到解决方案资源管理器的相对应得地方如图:




    并新建一个cpp空文件。

    3.下面开始进行写代码。
    这是如上图中mousePosition.cpp内的所有代码。
    1. #include "FlashRuntimeExtensions.h"

    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <string.h>
    5. #include<windows.h>


    6. extern "C"
    7. {
    8.         //初始化(必须的)
    9.         __declspec(dllexport) void initializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet);
    10.         //终结(必须的)
    11.         __declspec(dllexport) void finalizer(void* extData);
    12.         //被AS调用的
    13.         __declspec(dllexport) FREObject getMouseXY(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]);
    14. }

    15. extern "C"
    16. {

    17.         //运用winAPI内置方法的方法获得的鼠标坐标。
    18.         FREObject getMouseXY(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
    19.         {
    20.                 POINT cursorPos;
    21.                 //获取坐标的主要是这个傻逼玩意儿
    22.         GetCursorPos(&cursorPos);

    23.                 FREObject value = argv[0];

    24.                 //鼠标的xy坐标。
    25.                 int x = (int) cursorPos.x;
    26.                 int y = (int) cursorPos.y;


    27.                 FREObject fX,fY;


    28.                 FRENewObjectFromInt32(x,&fX);
    29.                 FRENewObjectFromInt32(y,&fY);

    30.                 //真正返回的是一个object类型数据,相当于{x:fX,y:fY}
    31.                 FRESetObjectProperty(value,(const uint8_t*)"x",fX,NULL);               
    32.                 FRESetObjectProperty(value,(const uint8_t*)"y",fY,NULL);        

    33.                 return NULL;
    34.         }


    35.         void contextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions)
    36.         {
    37.                 *numFunctions = 1;

    38.                 FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * (*numFunctions));
    39.                 //在初始化方法中声明可以被AS调用的方法
    40.                 func[0].name = (const uint8_t*) "getMouseXY";
    41.                 func[0].functionData = NULL;
    42.                 func[0].function = &getMouseXY;

    43.                 *functions = func;
    44.         }

    45.         void contextFinalizer(FREContext ctx)
    46.         {
    47.                 return;
    48.         }

    49.         __declspec(dllexport) void initializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer)
    50.         {
    51.                 *ctxInitializer = &contextInitializer;
    52.                 *ctxFinalizer = &contextFinalizer;
    53.         }

    54.         __declspec(dllexport) void finalizer(void* extData)
    55.         {
    56.                 return;
    57.         }


    58. }
    复制代码
    4发布dll: 右击项目,选择属性。弹出如下窗口:




    按照如图进行设置,在 配置属性-常规 里 目标文件扩展名:.dll    配置类型:动态库(.dll)  然后确定。
    然后选择release进行发布。 在Release文件夹下边出现了这个文件:





    swc的编写
    1 新建一个flex的库项目 如图:




    整体结构如:



    mousePosition.as的代码全部内容为:
    1. package cn.lyj.mouse
    2. {
    3.         import flash.external.ExtensionContext;

    4.         public class mousePosition
    5.         {
    6.                 //与刚才c++项目中定义的函数名要一直
    7.                 public static const GET_MOUSE_XY:String = "getMouseXY";
    8.                
    9.                 //与extension.xml中的id标签一致
    10.                 public static const EXTENSION_ID:String = "cn.lyj.mouse.mousePosition";
    11.                
    12.                 private var context:ExtensionContext;
    13.                 public function mousePosition()
    14.                 {
    15.                         //实例化上下文
    16.                         context = ExtensionContext.createExtensionContext(EXTENSION_ID,"");
    17.                 }
    18.                
    19.                 public function getMouseXY():Object
    20.                 {
    21.                         var obj:Object = new Object();               
    22.                         //远程调用上下文中的getMouseXY方法
    23.                         context.call(GET_MOUSE_XY,obj)
    24.                         return obj;                        
    25.                 }
    26.         }
    27. }
    复制代码

    extension.xml全部内容如下:


    1. <extension xmlns="http://ns.adobe.com/air/extension/3.1">
    2.         <id>cn.lyj.mouse.mousePosition</id>
    3.         <versionNumber>1.0.0</versionNumber>
    4.         <platforms>
    5.                 <platform name="Windows-x86">
    6.                         <applicationDeployment>
    7.                                 <nativeLibrary>mousePosition.dll</nativeLibrary>
    8.                                 <initializer>initializer</initializer>
    9.                                 <finalizer>finalizer</finalizer>
    10.                         </applicationDeployment>
    11.                 </platform>
    12.         </platforms>
    13. </extension>
    复制代码
    直接保存后,在这个项目的bin文件夹中就可以发现swc文件了:





    创建签名:
    ane是需要一个签名的,所以在这里需要创建签名。创建方法是随便找一个air项目右键导出:




    选择发行版。
    然后编辑一下数字签名就好了:




    签名保存之后是一个p12格式的文件,记住你的密码。


    打包ane
    将刚才得到的swc文件用winrar打开,然后解压得到两个文件:




    将刚才得到和编写的6个文件全部放到同一个文件夹下:




    新建一个txt文本。下面咱们来编写打包指令。

    adt -package -tsa none -storetype pkcs12 -keystore lyj.p12 -storepass 901230 -target ane demo.ane extension.xml -swc test.swc -platform Windows-x86 library.swf mousePosition.dll

    你可以直接把我上面的指令复制到刚才新建的txt文本内,然后按照自己文件的对应的名字进行一下更改。
    解释一下:
    -tsa none 这个是为了防止与http://timestamp.geotrust.com/进行获取时间戳的操作,因为在国内大部分网络是很和谐的所以连接外网会出现问题。如果不加这个指令的话会容易出现:Could not generate timestamp: handshake alert: unrecognized_name这样的错误。
    -storepass 刚才你建立的证书的密码。

    将此txt文本的扩展名改为bat。如图:




    双击此bat文件运行,如果不出意外的话会顺利生成出ane文件。如图:




    用这个ane文件别写自己的air程序
    新建一个桌面flex项目(一定要是桌面的才能用):
    然后对项目右键属性:




    Flex构建路径-本机扩展-添加ANE  找到刚才生成ane文件。




    然后查看 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.                                            width="233" height="79" applicationComplete="init()">
    6.         
    7.         <fx:Script>
    8.                 <![CDATA[
    9.                         import cn.lyj.mouse.mousePosition;
    10.                         var xxx:mousePosition = new mousePosition();
    11.                         public function init():void
    12.                         {

    13.                                 this.stage.addEventListener(Event.ENTER_FRAME,updata);
    14.                                 
    15.                                 
    16.                         }
    17.                         
    18.                         protected function updata(event:Event):void
    19.                         {
    20.                                 // TODO Auto-generated method stub
    21.                                 mX.text = xxx.getMouseXY().x;
    22.                                 mY.text = xxx.getMouseXY().y;
    23.                         }
    24.                         
    25.                 ]]>
    26.         </fx:Script>
    27.         <fx:Declarations>
    28.                 <!-- 将非可视元素(例如服务、值对象)放在此处 -->
    29.         </fx:Declarations>
    30.         <s:Label id="mX" x="57" y="35" text="标签"/>
    31.         <s:Label id="mY" x="145" y="35" text="标签"/>
    32. </s:WindowedApplication>
    复制代码
    运行后的效果图:




    现在两个label内的坐标就是鼠标的在全屏幕范围内的全局坐标啦。

    发布应用
    对刚才的项目进行右键,导出,发行版
    一定要选择:




    至于这次导出发行版时候所用的数字签名可以于上一次导出ane时候用的签名不同。 也就是说你写的ane包是可以给任何人用的。

    最后导出成功




    由于应用了本机扩展所以在win平台下只能导出exe安装包。mac下当然就是dmg了。

    安装进行尝试吧~
    源码如下:vs项目有点大就不上传了没什么东西。






    本文来自:http://bbs.9ria.com/thread-139940-1-2.html

    本帖子中包含更多资源

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

    x

    评分

    参与人数 1金币 +12 收起 理由
    破晓 + 12

    查看全部评分

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

    使用道具 举报

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

    本版积分规则

    
    关闭

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

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

    GMT+8, 2019-10-19 14:43 , Processed in 0.047529 second(s), 37 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

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