AIR ANE提示不存在函数ArgumentError: Error #3500: The extension context does not have a method with the name isSupported. at flash.external::ExtensionContext/_call() at flash.external::ExtensionContext/call()
关键词:Adobe Flash Flex ActionScript AS3 AIR Native Extension ANE Flash Runtime Extension FRE
一调用ANE函数就发生异常:
ArgumentError: Error #3500: The extension context does not have a method with the name isSupported.
at flash.external::ExtensionContext/_call()
at flash.external::ExtensionContext/call()
在网上看大家的问答,导致这个问题的原因千头万绪,我只能说说我的问题所在和解决方法
我是win32、Visual Studio环境
在编写dll的c语言或者c++那部分,扩展初始化(一般叫ExtensionInitializer或者MyExtensionInitializer)和扩展终止化(一般叫ExtensionFinalizer或者MyExtensionFinalizer)这两个函数(也就是在xml里面对应的两个函数)(不是扩展上下文Context初始化和扩展上下文Context终止化函数)
注意是不加Context的那两个函数名,在那两个函数(别的函数无所谓)的前面必须有导出dll的修饰(既可以在头文件.h里面的声明前面修饰,也可以在源文件的最上面写修饰,也可以直接在函数内容定义的前面加修饰)
由于ane的win32库用的是c语言的dll,而我用的是c++,c++和c语言在大多数方面兼容,但就是这个dll导出修饰符是不兼容的,c++一般来说想要导出一个dll写的是__declspec(dllexport)但这种写法合成的ane就会出现本文所提到的那个错误,只有把它写成提醒编译器兼容c语言的处理逻辑才能被获取到。
所以最终结论是:__declspec(dllexport)是不行的,
只有 extern "C" __declspec(dllexport) 才管用
只有 extern "C" __declspec(dllexport) 才管用
只有 extern "C" __declspec(dllexport) 才管用
例如:
extern "C" __declspec(dllexport) void MyExtensionInitializer(void** extDataToSet,FREContextInitializer* ctxInitializerToSet,FREContextFinalizer* ctxFinalizerToSet){
extDataToSet=NULL;
*ctxInitializerToSet=&MyContextInitializer;
*ctxFinalizerToSet=&MyContextFinalizer;
}
extern "C" __declspec(dllexport) void MyExtensionFinalizer(void* extData){}
另外,还有一些其它问题,如果不注意也会发生错误。例如在visual studio里面的(最上面调试按钮旁边、以及)解决方案的属性选对x86还是x64(选x86就行)(包括属性面板的最上面、VC++目录、链接器-高级-目标计算机),都核对了应该是x86;然后(先改了前面的)完了再去链接器-常规和链接器-输入分别定义附加库目录(文件夹)和附加依赖项(FlashRuntimeExtensions.lib)注意不要用#pragma命令不管用!如果发现lib文件有问题就把lib文件从airsdk目录重新复制过来一遍
浙公网安备 33010602011771号