Flex ANE介绍

最近在用Flex做项目,需要Flex连接刷卡器读卡,而卡片厂商只提供了dll、lib库,还提供java vb等一些语言的demo,没有flex的demo,于是开始研究flex的ane。

学过java的朋友可以把flex的ane理解成为java中的jni,就是调用本地方法。

        但在网上找ane关于window-x86的资料,聊聊无几,在网上参考了这一篇,终于写出了helloworld程序 AIR Native Extension c++ 鼠标全局坐标 配置环境到发布全程讲解       

,这篇文章对我帮助很大,但也有一点没讲到的地方,在此我以简单计算器的例子继续介绍一下flex端的方法如何传值到C++端,方便后人学习。

       Flex端调用add(x, y)返回结果,以Number为例子。官方也提供的详细的中文文档air_extensions.pdf

calc.cpp

#include "FlashRuntimeExtensions.h"
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<windows.h>


extern "C"
{
	//初始化(必须的)
	__declspec(dllexport) void initializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet);
	//终结(必须的)
	__declspec(dllexport) void finalizer(void* extData);
	//被AS调用的
	__declspec(dllexport) FREObject add(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]);
}

extern "C"
{

	//具体方法
	FREObject add(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
	{
			//入参x、y转换 将flex的number转换为double类型
			double x;
			FREGetObjectAsDouble(argv[0], &x);
			double y;
			FREGetObjectAsDouble(argv[1], &y);
			//返回值
			FREObject value = argv[2];
			FREObject result;
			//把结果赋值给result
			FRENewObjectFromDouble(x + y, &result);
			//赋值给返回值中的result属性 Flex端可以add(x, y).result调用
			FRESetObjectProperty(value,(const uint8_t*)"result",result,NULL);        

			return NULL;
	}


	void contextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions)
	{
		//方法数量
		*numFunctions = 1;

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

		*functions = func;
	}

	void contextFinalizer(FREContext ctx)
	{
		return;
	}

	__declspec(dllexport) void initializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer)
	{
		*ctxInitializer = &contextInitializer;
		*ctxFinalizer = &contextFinalizer;
	}

	__declspec(dllexport) void finalizer(void* extData)
	{
		return;
	}
}


calc.as

package com.chenlm
{
        import flash.external.ExtensionContext; 

        public class calc
        {
                //与刚才c++项目中定义的函数名要一直
                public static const ADD:String = "add";
                
                //与extension.xml中的id标签一致
                public static const EXTENSION_ID:String = "com.chenlm.calc";
                
                private var context:ExtensionContext;
                public function calc()
                {
                        //实例化上下文
                        context = ExtensionContext.createExtensionContext(EXTENSION_ID,"");
                }
                
                public function add(x:Number, y:Number):Number
                {
                        var obj:Object = new Object();                
                        //远程调用上下文中的add方法 此处的入参对应C++中的<span style="font-family: Arial, Helvetica, sans-serif;">FREObject argv[]</span>
                        context.call(ADD, x, y, obj)
                        return obj.result;                         
                }
        }
}

extension.xml代码
<extension xmlns="http://ns.adobe.com/air/extension/3.1">
        <id>cn.lyj.mouse.mousePosition</id>

        <versionNumber>1.0.0</versionNumber>
        <platforms>
                <platform name="Windows-x86">
                        <applicationDeployment>
                                <nativeLibrary>calc.dll</nativeLibrary>
                                <initializer>initializer</initializer>
                                <finalizer>finalizer</finalizer>
                        </applicationDeployment>
                </platform>
        </platforms>
</extension>

Main.mxml代码

Main.mxml代码
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                                           xmlns:s="library://ns.adobe.com/flex/spark"
                                           xmlns:mx="library://ns.adobe.com/flex/mx"
                                           width="333" height="189" ">
        <s:layout>
			<s:HorizontalLayout verticalAlign="middle"/>
		</s:layout>
        <fx:Script>
                <![CDATA[
                        import com.chenlm.calc;
                        var c:calc = new calc();
                        
                        protected function calc(event:Event):void
                        {
                             result.text = c.add(Number(x.text), Number(y.text));
                        }
                        
                ]]>
        </fx:Script>
		<mx:TextInput id="x" restrict="0-9/."/>
		<mx:TextInput id="y" restrict="0-9/."/>
		<s:Button label="计算" click="calc()">
        <s:Label id="result" text="结果"/>
</s:WindowedApplication></pre><br>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值