最近在用Flex做项目,需要Flex连接刷卡器读卡,而卡片厂商只提供了dll、lib库,还提供java vb等一些语言的demo,没有flex的demo,于是开始研究flex的ane。
extension.xml代码
Main.mxml代码
学过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;
}
}
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>