在多次尝试后,自己写的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>
// 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
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.openWithDefaultApplicati
我原来的程序是.air的,如果用扩展后,就会面临不能由.air升级成.exe的尴尬(虽然.exe升级可以用下载文件后打开exe安装的方法来解决,但是第一次由air变成exe的难题没法解决,有想法的同学留言哦)。