Pregunta

Estoy intentando hacer una extensión nativa de aire y después de una compilación exitosa de todos los componentes, Flash Builder 4.6 Logs "Error #3500: El contexto de extensión no tiene un método con el nombre ...".

Aquí está el código C ++ para la DLL nativa:

#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;
}

Aquí está el código para la interfaz 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();
        }
    }
}

Se agradecería cualquier ayuda para resolver este problema.

¿Fue útil?

Solución 5

He resuelto este problema. No estoy completamente seguro de cómo comencé con otro proyecto ANE y construido desde allí. Sin embargo, sospecho que el problema tenía que ver con los nombres de paquetes incorrectos en la parte de ActionScript del código y el descriptor de extensión.

Otros consejos

Consulte antes aquí: http://forums.adobe.com/thread/923158

Si recibió este error cuando tiene más de una extensión dentro del mismo proyecto, tenga cuidado: cada inicializador de métodos finalizadores debe tener nombres diferentes y únicos entre todas las extensiones. NÓTESE BIEN. No solo los métodos especificados en Extension.xml sino también los que delagas para inicializar el contexto. Para ser claros: no solo el inicializador de extensión sino también el inicializador de contexto dentro del proyecto debe tener nombres únicos entre todas las extensiones.

P.ej.:

 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;
}

Y lo mismo para el finalizador.

Espero que esto ayude.

Para resolver conflictos de nombre de símbolo entre Anes, hay una nueva opción ADT en el aire 3.4 es decir, HideanelibSymbols

Referirse: http://help.adobe.com/en_us/air/build/ws901d38e593cd1bac1e63e3d128cdca935b-8000.html

Además, para aliviar el proceso de comenzar a escribir un ANE para iOS, he escrito una plantilla Xcode Ane.

Referirse: https://github.com/divijkumar/xcode-template-ane

Lea las instrucciones en la página Wiki de GitHub antes de comenzar.

Tuvo el mismo problema pero en la máquina concreta (otros funcionan bien) y nada ayuda hasta que reconstruya mi dll con lanzar bandera. Parece que la versión de depuración solicita algunas DLL de addinación instaladas en la PC de usuario, ¡así que asegúrese de construir con la bandera de lanzamiento!

Parece que la función C ++ "getTring" tiene argumentos requeridos. Entonces cuando llamas _ExtensionContext.call("getString") as String; C ++ no tiene un método getString (). Quiere que pases por los argumentos también. Agregue estos al método de llamadas como así:

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

Los argumentos que pase deben ser del tipo apropiado especificados por el método C ++ getString.

Ver la referencia:http://help.adobe.com/en_us/flashplatform/reference/actionscript/3/flash/external/extensioncontext.html#call()

Esta pregunta es antigua, pero no hay una respuesta sólida. Me encontré con el mismo problema con un Android ANE. En su función/clase de Forextension, deber Devuelve una nueva instancia de FreContext y en ese caso de FreContext, usted deber Devuelve el mapa de funciones. Cometí el error de no devolver el mapa y correr como un pollo con la cabeza cortada tratando de averiguar qué estaba pasando. Esperemos que eso ayude a alguien en el futuro.

Tuve este mismo problema y ninguna de las otras respuestas aquí lo resolvió para mí. Estaba tratando de crear un C ++ ANE simple para el libro de jugadas de BlackBerry y obtendría un error #3500 cada vez que intentara ejecutarlo. El mismo código exacto funcionó bien en C. Resulta que el compilador C ++ estaba haciendo el nombre de nombre de método que no pudo encontrar el método que estaba llamando. Lo resolví envolviendo mis definiciones de función en "C" extern como esta:

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[]);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top