2011-12-02 41 views
1

我正在尝试进行AIR本机扩展,并且在成功编译所有组件后,Flash Builder 4.6记录“错误3500:扩展上下文不有名字的方法......“。AIR本机扩展“扩展上下文没有带名称的方法”

下面是本机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(); 
     } 
    } 
} 

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

+0

是整个错误信息? “...”后面是什么 –

+0

这是一个总结。以下是完整的错误:'ArgumentError:Error#3500:扩展上下文没有名称为getString的方法。 \t在flash.external :: ExtensionContext/_call() \t在flash.external :: ExtensionContext /()调用 \t在com.tests.TestANE :: TestANE /的getString()[M:\测试\ TestANE_SWC \ SRC \ TestANE \ TestANE.as:22] \t at TestANE/applicationInit()[M:\ Tests \ TestANE \ src \ TestANE.mxml:20] \t at TestANE/___ Test_WindowedApplication1_creationComplete()[M:\ Tests \ TestANE \ SRC \ TestANE.mxml:5]'... –

+0

继续:'在flash.events::EventDispatcher/dispatchEventFunction() \t在flash.events::EventDispatcher/dispatchEvent() \t在mx.core: :UIComponent/dispatchEvent()[E:\ dev的\ 4.Y \框架\项目\ FRAM ework \ src \ mx \ core \ UIComponent.as:13152] \t at mx.core :: UIComponent/set initialized()[E:\ dev \ 4.y \ frameworks \ projects \ framework \ src \ mx \ core \ UIComponent.as:1818] \t at mx.managers :: LayoutManager/doPhasedInstantiation()[E:\ dev \ 4.y \ frameworks \ projects \ framework \ src \ mx \ managers \ LayoutManager.as:842]' –

回答

0

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

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()

+0

我试图传递这样的null参数:'_ExtensionContext.call(“getString”,null)as String;'。这没有奏效。错误持续不变。 –

+0

来自ActionScript的所有参数都通过'argv'数组发送到C++。 –

0

这个问题很旧,但没有可靠的答案。我遇到了与Android ANE相同的问题。在您的Freextension功能/类中,您需要必须返回FREContext的新实例,并且在FREContext的实例中,您必须必须返回函数映射。我犯了一个错误,就是没有返回地图,像一只鸡一样四处乱跑,因为它的头部被切断,试图弄清楚发生了什么。希望这将有助于未来的人。

2

前请在这里看到: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; 
} 

与同为终结。

我希望这会有所帮助。

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[]); 
} 
1

有同样的问题,但具体的机器(人只是正常工作)并没有什么帮助,直到我重建我的DLL与开放标志 。它似乎像调试版本请求一些addise dll的安装在用户电脑上,所以确保你建立与释放标志!