下文是我对如何在windows环境下使用adobe air的本机扩展(ane)的一些心得。
本文针对flashcs5.5,cs6中对ane的支持已经有很大的提高。
一、官方帮助
http://help.adobe.com/zh_CN/air/build/index.html
主要参考:
1.针对 Adobe AIR 开发本机扩展
2.构建 Adobe AIR 应用程序
本文很多内容都来自这两个帮助文件。
二、官方网站上的一些ane库
http://www.adobe.com/devnet/air/native-extensions-for-air.html
我主要参考了其中的icu
http://blogs.adobe.com/globalization/invoking-icu-from-adobe-air-applications-part-2-using-flash-builder-4-6/
二、ane的作用
1.本机代码实现提供对特定于平台的功能的访问。这些特定于平台的功能在内置 ActionScript类中不可用,也无法在特定于应用程序的 ActionScript 类中实现。本机代码实现可以提供此类功能,因为它可以访问特定于设备的硬件和软件。
2.本机代码实现有时可能比仅使用 ActionScript的实现速度更快。
三、ane的使用
和 SWC 文件一样,ANE文件也是一个 ActionScript 类库,包含归档格式的 SWF文件和其他资源文件。以我自己建立的yt.ane(其实也是zip格式)为例,里面主要包括了一个library.swf文件和 yt.dll文件。
使用方法和使用swc文件是一样的,我简单用flash cs5.5建立一个 air 项目,在时间轴里输入如下代码
var yt:test1 = new test1();
mytext.text = yt.say();
以下来《自构建 AdobeAIR 应用程序》
1.在应用程序描述符文件中声明扩展
所有 AIR 应用程序都具有应用程序描述符文件。当应用程序使用本机扩展时,应用程序描述符文件包含一个
素。例如:
extensionID 元素的值与扩展描述符文件中的 id元素的值相同。扩展描述符文件是一个名为 extension.xml的文件打包在 ANE 文件中。您可使用归档提取器工具查看 extension.xml文件。
2.如果应用程序使用本机扩展,请在库路径中包含本机扩展的ANE文件。然后可以使用Flash Professional CS5来编译ActionScript代码。请执行以下操作:
1 将 ANE 文件的文件扩展名从 .ane更改为 .swc。必须执行此步骤,以便 Flash Professional可以找到文件。
2 在 FLA 文件中,选择“文件”>“ActionScript设置”。
3 在“高级 ActionScript 3.0设置”对话框中,选择“库路径”选项卡。
4 选择“浏览到 SWC 文件”按钮。
5 浏览到 SWC 文件,然后选择“打开”。
现在,SWC 文件将会显示在“高级 ActionScript 3.0设置”对话框的“库路径”选项卡中。
6 选择 SWC 文件后,再选择“为库设置链接选项”按钮。
7 在“库路径项目选项”对话框中,将“链接类型”更改为“外部”。
完成上面的工作后就可以使用ane了
我简单用flashcs5.5 建立一个 air项目,在时间轴里输入如下代码
var yt:test1 = new test1();
mytext.text = yt.say();
代码说明:
mytext是一个动态文本,yt.say是test1类的方法。
yt.say调用 yt.dll里的test方法
test1类(as3)代码
package
{
importflash.events.EventDispatcher;
importflash.external.ExtensionContext;
publicclass test1
{
private static varcontext:ExtensionContext;
publicfunction test1()
{
super();
try
{
context= ExtensionContext.createExtensionContext("test1", "");
}
catch(e:Error)
{
}
}
publicfunction say():String
{
varstr:String = context.call("test") as String;
returnstr;
}
}
}
yt.dll的test方法代码:
FREObject test(FREContext ctx, void*funcData, uint32_t argc, FREObject argv[])
{
constuint8_t* msg = (const uint8_t*)"hello world";
FREObjectretObj;
FRENewObjectFromUTF8(strlen((const char*)msg)+1, msg, &retObj);
returnretObj;
}
运行的结果是显示helloworld
3.ane打包
在flash cs.5.5内无法直接运行这个程序,必须要打包
可以新建bat文件来打包,我的打包语句如下,详细请参考官方文档。
"D:\Program Files\adobe\Adobe FlashCS5.5\AIR3.2\bin\adt" -package -storetype pkcs12 -keystore yt.p12 -target bundle myApp.exe application.xmlapp.swf -extdir extensionsDir
这样将所有的文件都打包到一个文件夹下,可以直接点击文件查看效果。
======================================================
一、使用 C 语言编写本机端代码(dll文件)
代码如下
#include"FlashRuntimeExtensions.h"
#include
#include
#include
extern "C" __declspec(dllexport)void ExtInitializer(void** extDataToSet, FREContextInitializer*ctxInitializerToSet,
FREContextFinalizer*ctxFinalizerToSet);
extern "C" __declspec(dllexport)void ExtFinalizer(void* extData);
extern "C" __declspec(dllexport)FREObject test(FREContext ctx, void* funcData, uint32_t argc, FREObjectargv[]);
void ContextInitializer(void* extData, constuint8_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*)"test";
func[0].functionData= NULL;
func[0].function= &test;
*functionsToSet= func;
}
FREObject test(FREContext ctx, void*funcData, uint32_t argc, FREObject argv[])
{
constuint8_t* msg = (const uint8_t*)"Hello world";
FREObjectretObj;
FRENewObjectFromUTF8(strlen((constchar*)msg)+1, msg, &retObj);
returnretObj;
}
void ContextFinalizer(FREContext ctx) {
return;
}
__declspec(dllexport) voidExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
FREContextFinalizer*ctxFinalizerToSet) {
*extDataToSet= NULL;
*ctxInitializerToSet= ContextInitializer;
*ctxFinalizerToSet= ContextFinalizer;
}
__declspec(dllexport) voidExtFinalizer(void* extData) {
return;
}
编辑生成 yt.dll文件
代码注释:
1. "FlashRuntimeExtensions.h"以及相应的FlashRuntimeExtensions.lib可在 AIRSDK目录中获得。
2. 对于 Windows 设备,请作为 DLL 文件提供库。将lib/windows 目录的 AIR SDK 目录中的库 FlashExtensions.lib 动态链接到您的DLL。此外,如果您的本机代码库使用 Microsoft 的任何 C 运行时库,请链接到 C 运行时库的多线程、静态版本。要指定此类型的链接,请使用 /MT 编译器选项。
3. 其它的内容参见官方帮助。
二、构建swc 文件
As代码
package
{
/**
* ...
* @author yt
*/
importflash.events.EventDispatcher;
importflash.external.ExtensionContext;
publicclass test1
{
privatestatic var context:ExtensionContext;
publicfunction test1()
{
super();
try
{
context= ExtensionContext.createExtensionContext("test1", "");
}
catch(e:Error)
{
}
}
publicfunction say():String
{
varstr:String = context.call("test") as String;
returnstr;
}
}
}
tes1.swc文件
三、打包成ane
"D:\Program Files\adobe\Adobe FlashCS5.5\AIR3.2\bin\adt" -package -target ane yt.ane yt.xml -swc test1.swc -platform Windows-x86library.swf yt.dl
1. Library.swf可从test1.swc中获得。
2. yt.xml中的内容
===============================================================