Собственные расширения AIR «В контексте расширения отсутствует метод с именем» - PullRequest
1 голос
/ 02 декабря 2011

Я пытаюсь создать собственное расширение AIR, и после успешной компиляции всех компонентов Flash Builder 4.6 записывает «Ошибка № 3500: у контекста расширения нет метода с именем ...».

Вот код C ++ для собственной DLL:

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

Любая помощь в решении этой проблемы будет принята.

Ответы [ 7 ]

2 голосов
/ 06 сентября 2012

Пожалуйста, смотрите раньше здесь: http://forums.adobe.com/thread/923158

Если вы получили эту ошибку, когда у вас есть несколько расширений внутри одного и того же проекта, пожалуйста, будьте осторожны: У каждого метода финализатора конца инициализатора ДОЛЖНЫ быть разные и уникальные имена между ВСЕМИ расширениями. NB. Не только методы, указанные в extension.xml, но и методы, которые вы делаете для инициализации контекста. Для ясности: НЕ только инициализатор расширения, но также инициализатор контекста внутри проекта ДОЛЖЕН иметь уникальные имена между ВСЕМИ расширениями.

Например: *. * 1006

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

И то же самое для финализатора.

Надеюсь, это поможет.

1 голос
/ 17 апреля 2015

Была такая же проблема, но на конкретной машине (другие работают просто отлично), и ничего не помогало, пока я не перестроил свою dll с release flag . Похоже, что отладочная версия запрашивает некоторые дополнения DLL, установленные на компьютере пользователя, поэтому убедитесь, что вы собираете с флагом выпуска!

1 голос
/ 07 сентября 2012

Чтобы разрешить конфликты имен символов между ANE, в AIR 3.4 существует новая опция ADT, т.е. hideANELibSymbols

См .: http://help.adobe.com/en_US/air/build/WS901d38e593cd1bac1e63e3d128cdca935b-8000.html

Кроме того, чтобы облегчить процесс начала написания ANE для iOS, я написал шаблон ANE для xcode.

См .: https://github.com/divijkumar/xcode-template-ane

Перед началом работы прочитайте инструкции на вики-странице github.

0 голосов
/ 21 октября 2013

У меня была такая же проблема, и ни один из других ответов здесь не решил ее для меня.Я пытался создать простой ANSI c ++ для Blackberry Playbook и получал ошибку # 3500 каждый раз, когда пытался ее запустить.Тот же самый точный код работал в Си. Оказывается, компилятор 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[]);
}
0 голосов
/ 27 августа 2012

Этот вопрос старый, но нет твердого ответа.Я столкнулся с той же проблемой с Android ANE.В вашей функции / классе FREExtension вы должны вернуть новый экземпляр FREContext, а в этом экземпляре FREContext вы должны вернуть карту функции.Я сделал ошибку, не вернув карту и бегая как курица с отрубленной головой, пытаясь понять, что происходит.Надеюсь, это поможет кому-то в будущем.

0 голосов
/ 07 декабря 2011

Я решил эту проблему.Я не совсем уверен, как, поскольку я начал с другого проекта ANE и построил оттуда.Однако я подозреваю, что проблема связана с неправильными именами пакетов в части кода ActionScript и дескрипторе расширения.

0 голосов
/ 02 декабря 2011

Похоже, что функция C ++ "getString" имеет обязательные аргументы.Поэтому, когда вы вызываете * 1001, * C ++ не имеет метода getString ().Он также хочет, чтобы вы проходили через аргументы.Добавьте их к методу вызова следующим образом:

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

Передаваемые вами аргументы должны быть соответствующего типа, определенного методом getString c ++.

См. Ссылку: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExtensionContext.html#call()

...