Adobe air ane项目尝试

最近在做一个pos机的项目,需要用air调用dll。就用到了ane。之前下载了几个ane的实例,直接嵌入后发布使用是没有问题( Adobe <wbr>air <wbr>ane项目尝试 戳这里)。但是自己写ane还是比较麻烦,不会c++和c,因此暂时只能依葫芦画瓢了,中间遇到了很多问题,主要出在C++上面,另外我对flex也熟,所以对我遇到的问题特此总结。

在多次尝试后,自己写的C++的dll终于被成功调用了。在debug中测试,总会显示dll中的方法找不到的情况,有人说是在windows-system32中放一个dll就行了 (但是最终我没有放居然也成功了。我用的是air3.4版本) ,还有就是c++代码的问题。我不是学计算机出身,除了语言as以外只会一点点C#,所以不是很明白写被外部调用的dll有哪些要点。经过无数次的失败和失望,终于找到了正途,现在我就把这取经路记录下来,省的下回忘了。


首先要添加这两个东西#include "FlashRuntimeExtensions.h";#pragma comment(lib,"FlashRuntimeExtensions")。这两个可以在airsdk中找到。(include和lib文件夹中)。放入c++项目名称的那个文件夹中。然后定义接口时,要放入extern "C"{}这个大括号中(自己建的),除了定义你要的那个接口外,还需要定义extension.xml中initializer和finalizer两个标签定义的两个方法(不要忘了在前面加上__declspec(dllexport)),同时还有这两个方法里面用的ContextInitializer和ContextFinalizer方法。如果有多个接口需要在ContextInitializer方法中进行配置。具体可以看《AIR Native Extension实现iOS应用内付费(In-App Purchase)全教程(二)——AIR面向iOS设备的原生扩展》里的内容

如我的extension.xml文件:

<extension xmlns="http://ns.adobe.com/air/extension/2.5">
<id>com.posAne.dlldydll</id>
<versionNumber>1.0.0</versionNumber>
<platforms>
<platform name="Windows-x86">
<applicationDeployment>
<nativeLibrary>dlldydll.dll</nativeLibrary>
<initializer>ExtInitializer</initializer>
<finalizer>ExtFinalizer</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension>


 我的C++代码(数据转换看这里
《使用面向 iOS 的 AIR 原生扩展传输数据 – 第 1 部分: 在 ActionScript 3 与 C、C++ 或 Objective-C 之间转换基本数据类型》《使用面向 iOS 的 AIR 原生扩展传输数据 – 第 2 部分:在 ActionScript 3 与 C、C++ 或 Objective-C 之间转换 Vector 和 Array 对象》):

// dlldydll.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "dlldydll.h"
#include "FlashRuntimeExtensions.h"
#pragma comment(lib,"FlashRuntimeExtensions")
#include "string.h"
#include "stdio.h"
#include "stdlib.h"


// 这是导出变量的一个示例
DLLDYDLL_API int ndlldydll=10;

// 这是导出函数的一个示例。
DLLDYDLL_API int fndlldydll(void){

return 1;
}


extern "C"
{
FREObject Login(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
int32_t iConType;
FREGetObjectAsInt32(argv[3],&iConType);

uint32_t idLength;
const uint8_t *pid;
FREGetObjectAsUTF8(argv[0],&idLength,&pid);

uint32_t nameLength;
const uint8_t *pname;
FREGetObjectAsUTF8(argv[1],&nameLength,&pname);


const char *newName=(const char*)pname;

FREObject idName;
FRENewObjectFromUTF8(strlen(newName)+1,(const uint8_t*)newName,&idName);
//printf("asfwef");
return idName;
}
void ContextInitializer(void* extData,const uint8_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*)"Login";
func[0].functionData=NULL;
func[0].function=&Login;
*functionsToSet=func;
}
void ContextFinalizer(FREContext ctx)
{
return;
}

__declspec(dllexport) void ExtInitializer(void** extDataToSet,FREContextInitializer* ctxInitializerToSet,FREContextFinalizer* ctxFinalizerToSet)
{
*extDataToSet=NULL;
*ctxInitializerToSet=&ContextInitializer;
*ctxFinalizerToSet=&ContextFinalizer;
}
__declspec(dllexport) void ExtFinalizer(void* extData)
{
return;
}
}
// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 dlldydll.h
//Cdlldydll::Cdlldydll()
//{
// return;


完成后就可以右键项目,生成dll了。


再看ane打包的事情,有几篇文章讲的比较好:《如何导出ane所需的swc》《如何打包多线程串口通讯ANE 》《AIR Native Extension c++ 鼠标全局坐标 配置环境到发布全程讲解》《如何打包ANE》


首先还需要除了上面说的dll文件和xml外还需要一个p12证书以及一个swf和swc文件(放在同一个文件夹中比较好操作)。


我是用flash builder4.6制作的swc,一开始用flash pro做的swc不行,一是必须继承sprite,而是无法添加参数swf-version13(version与xml中的extension/2.5还是3.1有关,前者最低要求13,后者要求14,不对的话,打包的时候会报错).所以就用fb来做。具体的内容格式参见以上几篇文章就行了(需注意创建的ExtensionContext指向的id要和xml中的id对应)。swc出来后,在解压得到catalog.xml和library.swf.


 然后打包就要用到adt命令。adt命令是指airsdk中bin文件夹下的adt.bat.如果不设置环境变量,就需要让命令行指向这个bin文件夹(cd命令)然后运行adt命令。在win7下设置变量环境的步骤:邮件“计算机”-“高级系统设置”-“环境变量”选择系统变量中的path,点编辑,在path值的最后面加上“;”然后再加上bin文件夹的地址,点确定就好了。然后adt命令可以写在txt中,然后改后缀为.bat就不用每次都写那么一长串了。如果打包时出现‘java’不是内部或外部命令的情况,就是还需要配置一下java环境,方法同上,没有安装的先安装jdk。下面是我的打包语句:


adt -package -tsa none -storetype pkcs12 -keystore mycert.p12 -storepass 12344321 -target ane dlldydll.ane extension.xml -swc Epos.swc -platform Windows-x86 library.swf dlldydll.dll


把打包后的ane文件添加到flash项目中,然后就可以使用了。


另外还有这么一个问题,updater类有以下限制。

仅桌面配置文件支持 Updater 类。扩展桌面应用程序(使用本机安装程序安装的应用程序)不支持此功能,AIR 移动配置文件或 AIR for TV 配置文件也不支持此功能。检查 Updater.isSupported 属性。扩展桌面应用程序(使用本机安装程序安装的应用程序)可以下载本机安装程序的新版本,并使用 File.openWithDefaultApplication() 方法启动它。


我原来的程序是.air的,如果用扩展后,就会面临不能由.air升级成.exe的尴尬(虽然.exe升级可以用下载文件后打开exe安装的方法来解决,但是第一次由air变成exe的难题没法解决,有想法的同学留言哦)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值