qxdld

生而灾星,请务必坚强

导航

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目录重新复制过来一遍

posted on 2026-03-07 20:58  Sherilyn  阅读(0)  评论(0)    收藏  举报