破晓 发表于 2015-8-6 13:40:23

手把手教你创建一个windows下的AIR本机扩展程序(1)——创...

手把手教你创建一个windows下的AIR本机扩展程序(1)——创建dll


需要生成一个AIR本机扩展程序需要以下几个步骤:

[*]一、编写本机扩展代码;
[*]二、编写extension.xml;
[*]三、编写AS端的扩展代码,并生成相应的swc文件;
[*]四、打包ANE;
[*]五、编写AS项目并使用ANE;



一、编写本机扩展代码:
环境:VS2010

先在VS2010下新建一个win32的DLL工程,然后将flash builder安装目录下的sdk里面的
FlashRuntimeExtensions.h(C:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\include)
和FlashRuntimeExtensions.lib(C:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\lib\win)复制到工程所在文件夹下,
并将其添加到工程中,见下图:



然后就可以开始编写dll代码了。
dll代码里面主要包括3个方面:


[*]ExtensionInitializer以及ExtensionFinalizer函数
[*]FREContextInitializer以及FREContextFinalizer函数
[*]可供AS调用的函数

(前两点是必要的!)

ps:各个函数的编写格式可以查看FlashRuntimeExtensions.h中的定义。

.C文件:
#include "MyExtension.h"

//ext初始化函数
void MyExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
FREContextFinalizer* ctxFinalizerToSet) {
extDataToSet = NULL;
*ctxInitializerToSet = &MyContextInitializer;
    *ctxFinalizerToSet = &MyContextFinalizer;
}

//ext终止函数
void MyExtFinalizer(void* extData)
{
return;
}

//上下文初始化函数
void MyContextInitializer(void* extData,const uint8_t* ctxType,FREContext ctx,
uint32_t* numFunctionsToSet,const FRENamedFunction** functionsToSet)
{
*numFunctionsToSet = 1; //可供AS调用的函数个数

    FRENamedFunction* func = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*(*numFunctionsToSet));//动态分配储存函数信息的内存空间
    func.name = (const uint8_t*)"helloExtension";//该函数对对应AS调用的名称
    func.functionData = NULL;
    func.function = &helloExtension;//该函数实际指针
   
    *functionsToSet = func;
}

//上下文终止函数
void MyContextFinalizer(FREContext ctx)
{
return;
}

//AS调用函数
FREObject helloExtension(FREContext ctx,void* functionData,uint32_t argc,FREObjectargv[])
{
const char * String = "helloExtension";
FREObject reObj;
FRENewObjectFromUTF8(strlen(String)+1,(const uint8_t*)String,&reObj);
return reObj;
}


.h文件
#include "FlashRuntimeExtensions.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


//对外部可见的dll接口函数
extern "C" __declspec(dllexport) void MyExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
FREContextFinalizer* ctxFinalizerToSet);

extern "C" __declspec(dllexport) void MyExtFinalizer(void* extData);

extern "C" __declspec(dllexport) FREObject helloExtension(FREContext ctx,void* functionData,uint32_t argc,FREObjectargv[]);



void MyContextInitializer(void* extData,const uint8_t* ctxType,FREContext ctx,
uint32_t* numFunctionsToSet,const FRENamedFunction** functionsToSet);

void MyContextFinalizer(FREContext ctx);


然后生成项目,就可以在项目的Debug文件夹中找到相应的dll文件了(谨记是sln所在文件夹的Debug)



本文来自:http://blog.sina.com.cn/s/blog_6471e1bb01012c2k.html


破晓 发表于 2015-8-6 13:41:45

手把手教你创建一个windows下的AIR本机扩展程序(2)——extension.xml


extension里面包含一个xml文件(描述性文件),用于extension里面的各种属性。当你开发你自己的extension时,你需要自行创建一个xml文件。下面是xml中需要写入的内容介绍:
      A、以namespace说明开头
    <extension xmlns="http://ns.adobe.com/air/extension/2.5">   
      B、接着是extension的ID和版本号    <id>com.example.SampleExtension</id>   <versionNumber>1.0.4</versionNumber>      C、还有几个可供选择的标签(对识别extension很有用)[可省]    <name>Sample Extension</name>    <description>      <text lang="en-US">This is a description.</text>      <text lang="fr-FR">C'est une description.</text>    </description>    <copyright>Copyright 2011, Sample Inc.</copyright>(描述不需要被本地化(localized),但如果需要,name和copyright可以被本地化)[何谓本地化???]      D、紧接着是列出此extension所支持的平台和各个平台的相关重要信息    一个平台的application-bundled实现声明:相应的库的名称、加上一个初始化函数。(这个稍后再详细介绍),下面先看一个例子:    <platforms>      <platform name="Windows-x86">      <applicationDeployment>          <nativeLibrary>sample.dll</nativeLibrary>          <initializer>InitSample</initializer>      </applicationDeployment>      </platform>     对于device-bundled实现的声明就相对简单一点,因为设备已经识别到相关的库和方法:    <platform name="Sample-ARM">      <deviceDeployment/>    </platform>    E、最后,extension可以包含一个“默认”平台的实现。实现必须使用ActionScript,因为实际的平台是不知道。它必须面向app部署(因为该app的使用平台还不知道),因为有没有办法保证所有设备都能够绑定默认。它的代表在这样的描述:      <platform name="default">      <applicationDeployment/>      </platform>    </platforms></extension>
而在此实例中的extension.xml如下: <extension xmlns="http://ns.adobe.com/air/extension/2.5">
    <id>be.ljf.MyExtension</id>
    <versionNumber>1.0.0</versionNumber>
    <platforms>
      <platform name="Windows-x86"> <!--平台名称-->
            <applicationDeployment>
                <nativeLibrary>MyExtension.dll</nativeLibrary> <!--填入相应的.dll文件名-->
                <initializer>MyExtInitializer</initializer> <!--dll中Ext初始化函数名-->
                <finalizer>MyExtFinalizer</finalizer> <!--dll中Ext终止函数名-->
            </applicationDeployment>
      </platform>
    </platforms>
</extension>

破晓 发表于 2015-8-6 13:42:29

手把手教你创建一个windows下的AIR本机扩展程序(3)——构建SWC


具体的构建方法可以查看本博的 《如何导出ane所需的swc》地址:http://blog.sina.com.cn/s/blog_6471e1bb01012ard.html下面给出简单的描述以及代码:
在flex库项目中新建AS类文件(包名为be.ljf.MyExtension),复制一下代码:
package be.ljf.MyExtension
{
import flash.events.EventDispatcher;
import flash.external.ExtensionContext;

public class MyExtension extends EventDispatcher
{
private static var isInstantiated:Boolean = false;
private static var context:ExtensionContext;
public function MyExtension()
{
super();
if(isInstantiated)
return;
try
{
context = ExtensionContext.createExtensionContext("be.ljf.MyExtension","");
isInstantiated = true;
}
catch(e:Error)
{
}
}
public function helloExtension():*
{
return context.call("helloExtension");
}
}
}

然后构建项目,即可得到SWC文件



破晓 发表于 2015-8-6 13:46:48

手把手教你创建一个windows下的AIR本机扩展程序(4)——打包ANE


首先先说一下打包ANE必须的部件:


[*]ActionScript扩展库SWC
[*]本机扩展库
[*]extension.xml(本机扩展的描述性文件)
[*]library.swf(可以从SWC中解压得出)
[*].p12签名文件(可以使用任何一个由fl或者fb生成的.p12文件)
[*]AIR3或以上的SDK



下面详细描述一下ANE的打包步骤:

1、先将要打包的文件放入同一个文件夹(上述的1~5)
2、再将flash builder下的sdk下的bin、lib文件夹(我机子的路径:C:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0)复制到该文件夹中,如下图所示:




(其中catalog.xml文件可省)
2、运行命令行并将其路径设置到该文件夹路径上,然后键入:
bin/adt -package -storetype pkcs12 -keystore .p12文件名称.p12 -storepass .p12文件的密码 -target ane 需要生成的ane的名称.ane extension.xml -swc swc名称.swc -platform 平台名称 library.swf 本机扩展库
其中-platform有一下选项:
Android-ARM.(大伙们说这里要有".")
iPhone-ARM
MacOS-x86
Windows-x86


输入后回车即可在该目录中自动生成所需的.ane文件
下面提供一个完整的例子:





3、打包ANE时可能遇到的错误:
A、Java不是内部或外部命令,也不是批处理文件(这个请留意以前发的博客文章即可找到答案)
B、Invalid swc file.The extension NameSpace requires the swf verison to be 13 or lower.(请留意“如何导出ane所需的swc”一文)
C、Could not generate timestamp: handshake alert: unrecognized_name
    解决办法:在后面加入 -tsa none








打包多个平台下的ANE:




破晓 发表于 2015-8-6 13:48:08

手把手教你创建一个windows下的AIR本机扩展程序(5)——测试


新建一个flex桌面项目,在构建路径中选择本机扩展,将之前生成的.ane文件添加进去,如下图:




然后在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"
applicationComplete="applicationCompleteHandler(event)">
<s:layout>
<s:VerticalLayout paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"/>
</s:layout>
<fx:Script>
<![CDATA[
import be.ljf.MyExtension.MyExtension;
import mx.events.FlexEvent;
private var ext:be.ljf.MyExtension.MyExtension;
protected function applicationCompleteHandler(event:FlexEvent):void
{
ext = new be.ljf.MyExtension.MyExtension();
trace("application complete");
}
protected function clickHandler(event:MouseEvent):void
{
outputField.text = ext.helloExtension();
//outputField.text = String(ext.testUint(12));
trace("click handler");
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:TextInput id="outputField" width="100%"/>
<s:Button width="100%" label="Button" click="clickHandler(event)"/>
</s:WindowedApplication>


运行,即可看到效果~


页: [1]
查看完整版本: 手把手教你创建一个windows下的AIR本机扩展程序(1)——创...