Расширения нативного воздуха «Контекст расширения не имеет метода с именем»
-
27-10-2019 - |
Вопрос
Я пытаюсь сделать расширение нативного воздуха, и после успешного сборника всех компонентов 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();
}
}
}
Любая помощь в решении этой проблемы будет оценена.
Решение 5
Я решил эту проблему. Я не совсем уверен, как я начал с другого проекта ANE и построил оттуда. Однако я подозреваю, что проблема была связана с неправильными именами пакетов в части ActionScript в коде и дескрипторе расширения.
Другие советы
Пожалуйста, смотрите здесь: 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;
}
И то же самое для финализатора.
Надеюсь, это поможет.
Чтобы разрешить конфликты имени символа между ANE, в Air 3.4 появилась новая опция ADT.
Ссылаться: http://help.adobe.com/en_us/air/build/ws901d38e593cd1bac1e63e3d128cdca935b-8000.html
Кроме того, чтобы облегчить процесс начала работы с написанием ANE для iOS, я написал шаблон Xcode ANE.
Ссылаться: https://github.com/divijkumar/xcode-template-ane
Прочитайте инструкции на странице Wiki GitHub, прежде чем начать работу.
Была такая же проблема, но на конкретной машине (другие работают просто отлично), и ничего не помогает, пока я не восстановил свой DLL с выпустить флаг. Анкет Похоже, что отладочная версия запросит некоторую DLL DLL, установленную на пользовательском ПК, поэтому убедитесь, что вы создаете с флагом выпуска!
Похоже, что функция C ++ «GetString» требует аргументов. Итак, когда вы звоните _ExtensionContext.call("getString") as String;
C ++ не имеет метода GetString (). Он хочет, чтобы вы также проходили аргументы. Добавьте их в метод вызова, как SO:
_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()
Этот вопрос старый, но нет солидного ответа. Я столкнулся с той же проблемой с Android ANE. В вашей функции Freextension/класс вы должен Верните новый экземпляр Frecontext и в этом случае Frecontext, вы должен вернуть карту функции. Я совершил ошибку, не вернув карту и бегал, как курица с отрезанной головой, пытаясь выяснить, что происходит. Надеюсь, это поможет кому -то в будущем.
У меня была такая же проблема, и ни один из других ответов здесь не решил это для меня. Я пытался создать простой C ++ ANE для BlackBerry Playbook и получил ошибку #3500 в любое время, когда пытался его запустить. Тот же самый точный код работал нормально в C. Оказывается, компилятор C ++ выполнял имя метода, так что он не мог найти метод, который я звонил. Я решил это, обернув определения функции на внешнем «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[]);
}