2011-12-02 64 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的安裝在用戶電腦上,所以確保你建立與釋放標誌!