AIR 本机扩展"The extension context does not have a method with the name"



我正在尝试使一个AIR本地扩展和成功编译所有组件后,Flash Builder 4.6日志"错误#3500:扩展上下文没有一个方法与名称…"。

这是本地DLL的c++代码:

#include "stdafx.h"
#include "TestANE.h"
#include "FlashRuntimeExtensions.h"
#include <string>
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
FREObject isSupported(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
    FREObject result;
    uint32_t isSupportedSwitch = 1;
    FRENewObjectFromBool(isSupportedSwitch, &result);
    return result;
}
FREObject getString(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
    FREObject result;
    const char *testString = "Hello World from C++!";
    FRENewObjectFromUTF8(strlen(testString)+1, (const uint8_t *) testString, &result);
    return result;
}
void taneContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions) { 
    *numFunctions = 2;
    FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * (*numFunctions));
    func[0].name = (const uint8_t*) "isSupported";
    func[0].functionData = NULL;
    func[0].function = &isSupported;
    func[1].name = (const uint8_t*) "getString";
    func[1].functionData = NULL;
    func[1].function = &getString;
    *functions = func;
}
void taneContextFinalizer(FREContext ctx) {
    return;
}
void taneInitializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer) { 
    *ctxInitializer = &taneContextInitializer;
    *ctxFinalizer = &taneContextFinalizer;
}
void taneFinalizer(void* extData) {
    return;
}

下面是ActionScript 3接口的代码:

package com.tests.TestANE {
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;
    import flash.external.ExtensionContext;
    public class TestANE extends EventDispatcher {
        private var _ExtensionContext:ExtensionContext;
        public function TestANE(target:IEventDispatcher=null) {
            this._ExtensionContext = ExtensionContext.createExtensionContext("com.tests.TestANE", null);
            super(target);
        }
        public function isSupported():Boolean {
            return _ExtensionContext.call("isSupported") as Boolean;
        }
        public function getString():String {
            return _ExtensionContext.call("getString") as String;
        }
        public function dispose():void {
            this._ExtensionContext.dispose();
        }
    }
}

请参阅此处:http://forums.adobe.com/thread/923158

如果在同一个项目中有多个扩展时出现此错误,请注意:每个初始化器和终结器方法在所有扩展中必须具有不同且唯一的名称。NB。不仅包括在extension.xml中指定的方法,还包括委派来初始化上下文的方法。需要明确的是:不仅扩展初始化器,项目中的上下文初始化器也必须在所有扩展之间具有唯一的名称。

如:

 void UNIQUE_NAME_ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, 
                    FREContextFinalizer* ctxFinalizerToSet) {
       NSLog(@"Entering ExtInitializer()");
       *extDataToSet = NULL;
       *ctxInitializerToSet = &UNIQUE_NAME_ContextInitializer;
       *ctxFinalizerToSet = &UNIQUE_NAME_ContextFinalizer;
       NSLog(@"Exiting ExtInitializer()");
}
void UNIQUE_NAME_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*) "scan";
    func[0].functionData = NULL;
    func[0].function = &scan;
    *functionsToSet = func;
}

终结器也是如此。

为了解决ANEs之间的符号名称冲突,AIR 3.4中有一个新的ADT选项,即hideANELibSymbols

参考:http://help.adobe.com/en_US/air/build/WS901d38e593cd1bac1e63e3d128cdca935b-8000.html

此外,为了简化开始为iOS编写ANE的过程,我编写了一个xcode ANE模板。

参考:https://github.com/divijkumar/xcode-template-ane

在开始之前一定要阅读github wiki页面上的说明。

有同样的问题,但在具体的机器上(其他人工作得很好),没有任何帮助,直到我用释放标志重建我的dll。似乎调试版本要求在用户pc上安装一些添加dll,所以请确保您使用发布标志构建!

c++函数"getString"似乎需要参数。所以当你叫_ExtensionContext.call("getString") as String;时c++没有getString()方法。它也希望你传递参数。将这些添加到call方法中,如下所示:

_ExtensionContext.call("getString", arg, arg1, arg2) as String;

传递的参数必须是c++ getString方法指定的适当类型。

参见参考文献:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExtensionContext.html调用()

我已经解决了这个问题。我不完全确定我是如何开始另一个ANE项目并从那里构建的。然而,我怀疑这个问题与代码的ActionScript部分和扩展描述符中的错误包名有关。

这个问题很老了,但是没有确切的答案。我在Android ANE上遇到了同样的问题。在FREExtension函数/类中,必须返回FREContext的新实例,并且在FREContext的实例中,必须返回函数映射。我犯了一个错误,没有归还地图,像只无头苍蝇一样跑来跑去,试图弄清楚发生了什么。希望这对将来的人有所帮助。

我有同样的问题,这里没有其他的答案为我解决它。我试图为黑莓Playbook创建一个简单的c++ ANE,每次我试图运行它都会得到一个错误#3500。同样的代码在c中工作得很好。事实证明,c++编译器正在做方法名称混淆,所以它找不到我正在调用的方法。我通过在外部"C"中包装我的函数定义来解决这个问题,像这样:

extern "C" {
    void ExtensionInitializer(void** extDataToSet,
        FREContextInitializer* ctxInitializerToSet,
        FREContextFinalizer* ctxFinalizerToSet);
    void ExtensionFinalizer();
    void ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx,
        uint32_t* numFunctionsToSet, const FRENamedFunction** functionsToSet);
    void ContextFinalizer(FREContext ctx);
    FREObject myMethod(FREContext ctx, void* functionData, uint32_t argc,
        FREObject argv[]);
}

相关内容

最新更新