1

我正在尝试制作 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();
        }
    }
}

解决此问题的任何帮助将不胜感激。

4

7 回答 7

2

请在此处查看之前:http ://forums.adobe.com/thread/923158

如果您在同一个项目中有多个扩展时遇到此错误,请注意:每个初始化程序结束程序方法必须在所有扩展程序之间具有不同且唯一的名称。注意。不仅是在 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;
}

终结者也是如此。

我希望这有帮助。

于 2012-09-06T11:49:47.023 回答
1

为了解决 ANE 之间的符号名称冲突,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 页面上的说明。

于 2012-09-07T07:08:53.550 回答
1

有同样的问题,但在混凝土机器上(其他机器工作得很好),直到我用发布标志重建我的 dll 之前没有任何帮助。似乎调试版本请求在用户 PC 上安装了一些附加 dll,因此请确保使用发布标志进行构建!

于 2015-04-17T16:55:15.963 回答
0

C++ 函数“getString”似乎具有必需的参数。因此,当您调用_ExtensionContext.call("getString") as String; C++ 时,没有 getString() 方法。它还希望您通过参数。像这样将这些添加到调用方法中:

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

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

请参阅参考: http ://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExtensionContext.html#call ()

于 2011-12-02T18:41:02.890 回答
0

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

于 2011-12-06T20:50:17.623 回答
0

这个问题很老,但没有可靠的答案。我在使用 Android ANE 时遇到了同样的问题。在您的 FREExtension 函数/类中,您必须返回 FREContext 的新实例,并且在该 FREContext 实例中,您必须返回函数映射。我犯了一个错误,没有归还地图,而是像一只被砍头的鸡一样到处乱跑,试图弄清楚发生了什么。希望这对将来的人有所帮助。

于 2012-08-27T17:36:33.777 回答
0

我遇到了同样的问题,这里的其他答案都没有为我解决。我试图为 Blackberry Playbook 创建一个简单的 c++ ANE,并且在我尝试运行它的任何时候都会收到错误 #3500。完全相同的代码在 C 中运行良好。事实证明,c++ 编译器正在进行方法名称修改,因此它找不到我正在调用的方法。我通过将函数定义包装在 extern "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[]);
}
于 2013-10-21T13:47:22.273 回答