下文是我對如何在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 應用程式都具有應用程式描述項檔案。當應用程式使用本機擴充時,應用程式描述項檔案包含一個
素。例如:
<extensions>
<extensionID>test1</extensionID>
</extensions>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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中的內容
<extensionxmlns="http://ns.adobe.com/air/extension/3.2">
<id>test1</id>
<versionNumber>1.0.0</versionNumber>
<platforms>
<platform name="Windows-x86">
<applicationDeployment>
<nativeLibrary>yt.dll</nativeLibrary>
<initializer>ExtInitializer</initializer>
<finalizer>ExtFinalizer</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension>
===============================================================
flash cs6中使用ane(windows本機擴充)
1.建立air項目,
2.加入ane檔案
菜單檔案 --->actionscript 設定
選中ane檔案加入
3.設定air
安裝程式和嵌入運行時的應用程式可任選一個
在windows環境下使用ane必須選中延伸桌面
4.可直接在flash cs6中測試。
5.測試後直接發布,不需要你修改設定檔。