РЕДАКТИРОВАТЬ: наконец-то я смог создать "Hello, World!" набор проектов. Если у вас также есть Error #3500
проблемы, см. мой ответ ниже для получения рабочего набора проектов.
Сейчас я пишу "Hello, World!" Собственное расширение для Adobe AIR с FlashDevelop. Таким образом, мое собственное расширение предназначено для использования платформами Windows-x86, на которых я программирую.
Я создал ANE с помощью (пользовательского) командного файла. Тестовое приложение AIR, которое использует этот ANE, компилируется нормально, но, как и многие другие люди, сообщения которых я видел, я получаю Error #3500: The extension context does not have a method with the name helloWorld.
Я уже три дня пытаюсь понять, что происходит, и, несмотря на исправление нескольких причин, все еще получаю ту же ошибку.
Кажется, что среда выполнения приложения никогда не может вызвать функцию initializeExtension
, поскольку DebugView ничего не отслеживает, хотя мой инициализатор использует OutputDebugString(L"Extension initialized");
.
Мне немного не по себе из-за того, что я опубликовал много кода, но после трех дней и десятков прочитанных веб-страниц я просто не уверен, откуда взялась моя проблема.
В любом случае, сборка приложения выполняется в 3 этапа:
1) Сборка DLL в Visual Studio с флагом Release. Я публикую этот код в ответ на комментарий Майкла ниже, однако я не уверен, что ошибка исходит оттуда.
Моя нативная часть в основном состоит из заголовка и файла C ++:
// -------------------------
// | NativeExtensionTest.h |
// -------------------------
#pragma once
#include "FlashRuntimeExtensions.h"
#ifdef __cplusplus
EXTERN_C
{
#endif
__declspec(dllexport) void initializeExtension(
void** dataToSet,
FREContextInitializer* contextInitializer,
FREContextFinalizer* contextFinalizer
);
__declspec(dllexport) void finalizeExtension(
void* extData
);
__declspec(dllexport) void initializeContext(
void* contextData,
const uint8_t* contextType,
FREContext context,
uint32_t* nFunctionsToSet,
const FRENamedFunction** functionsToSet
);
__declspec(dllexport) void finalizeContext(
FREContext context
);
__declspec(dllexport) FREObject helloWorld(
FREContext context,
void* functionData,
uint32_t argc,
FREObject argv[]
);
#ifdef __cplusplus
}
#endif
А вот и реализация функций:
// ------------------
// | HelloWorld.cpp |
// ------------------
#pragma once
#include "stdafx.h" // precompiled header ; includes cstdlib, cstring and windows.h
#include "FlashRuntimeExtensions.h"
#include "NativeExtensionTest.h"
using namespace std;
void initializeExtension(
void** dataToSet,
FREContextInitializer* contextInitializer,
FREContextFinalizer* contextFinalizer
)
{
dataToSet = NULL;
*contextInitializer = &initializeContext;
*contextFinalizer = &finalizeExtension;
}
void finalizeExtension(
void* extData
)
{ }
void initializeContext(
void* contextData,
const uint8_t* contextType,
FREContext context,
uint32_t* nFunctionsToSet,
const FRENamedFunction** functionsToSet
)
{
*nFunctionsToSet = 1;
FRENamedFunction* functions = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)* (*nFunctionsToSet));
functions[0].name = (const uint8_t*)"helloWorld";
functions[0].function = &helloWorld;
functions[0].functionData = NULL;
*functionsToSet = functions;
}
void finalizeContext(
FREContext context
)
{ }
FREObject helloWorld(
FREContext context,
void* functionData,
uint32_t argc,
FREObject argv[]
)
{
char* hello = "Hello, World!";
unsigned int helloLength = strlen(hello) + 1;
FREObject ret;
FRENewObjectFromUTF8(helloLength, (const uint8_t*)hello, &ret);
return ret;
}
Как и просили alebianco, вот журнал сборки при сборке DLL. Обратите внимание, что у меня есть ошибка в самом конце журнала, в конце выполнения пользовательского командного файла сборки. Я не знаю, откуда взялась эта ошибка; У меня не было этой ошибки в прошлый раз, когда я создавал этот проект. Кроме того, это, вероятно, внутреннее для FlashDevelop.
2) Создание ANE. Я использую командный файл для выполнения следующих команд:
Чтобы построить SWC, я вызываю compc. После раскрытия переменной это выглядит так:
compc -include-sources"C:\Users\Anthony Dentinger\Desktop\Native Extension Test\src" -output "C:\Users\Anthony Dentinger\Desktop\Native Extension Test\ANE Build Files\NativeExtHelloWorld.swc" -load-config "C:\Users\Anthony Dentinger\AppData\Local\FlashDevelop\Apps\flexsdk\4.6.0\frameworks\air-config.xml" -swf-version 14
Моя папка src
содержит простой класс:
package
{
import flash.events.EventDispatcher;
import flash.external.ExtensionContext;
public class NativeExtHelloWorld extends EventDispatcher {
private var extContext:ExtensionContext;
public function NativeExtHelloWorld()
{
extContext = ExtensionContext.createExtensionContext("NativeExtHelloWorld", "helloWorldContext");
}
public function helloWorld() : String
{
return String(extContext.call("helloWorld"));
}
}
}
В свою очередь, скопировав как DLL из моей папки Visual Studio, так и library.swf
(который я извлекаю из SWC) в ANE Build Files\platforms\Windows-x86
, я создаю ANE с помощью adt. После раскрытия переменной команда выглядит так:
call adt -package -target ane "C:\Users\Anthony Dentinger\Desktop\Native Extension Test\ANE Build Files\HelloExtension.ane" "C:\Users\Anthony Dentinger\Desktop\Native Extension Test\ANE Build Files\descriptor.xml" -swc "C:\Users\Anthony Dentinger\Desktop\Native Extension Test\ANE Build Files\NativeExtHelloWorld.swc" -platform "Windows-x86" -C "C:\Users\Anthony Dentinger\Desktop\Native Extension Test\ANE Build Files\platforms\Windows-x86" .
Вот дескриптор расширения, который я предоставляю adt:
<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="http://ns.adobe.com/air/extension/3.1">
<id>NativeExtHelloWorld</id> <!--I'll later change that ID to something like com.example.myExt.HelloWorld-->
<name>Exension Name</name>
<description>Description of the Extension</description>
<versionNumber>0.0.1</versionNumber>
<copyright>© 2010, Examples, Inc. All rights reserved.</copyright>
<platforms>
<platform name="Windows-x86">
<applicationDeployment>
<nativeLibrary>HelloWorld.dll</nativeLibrary>
<initializer>initializeExtension</initializer>
<finalizer>finalizeExtension</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension>
3) Создание фактического приложения. Я использую пакетные файлы по умолчанию, созданные FlashDevelop (с двумя модификациями, включающими ANE) для создания проекторов AIR AS3.
Обратите внимание: если я получаю ошибку № 3500, это означает (я полагаю), что мое приложение успешно включило мой класс из ANE, поскольку конструктор работает.
Это дескриптор приложения, который я использую на всякий случай.
<?xml version="1.0" encoding="utf-8" ?>
<application xmlns="http://ns.adobe.com/air/application/15.0">
<id>TEST</id>
<versionNumber>1.0</versionNumber>
<filename>TEST</filename>
<name>TEST</name>
<initialWindow>
<title>TEST</title>
<content>TEST.swf</content>
<systemChrome>standard</systemChrome>
<transparent>false</transparent>
<visible>true</visible>
<minimizable>true</minimizable>
<maximizable>true</maximizable>
<resizable>true</resizable>
</initialWindow>
<supportedProfiles>extendedDesktop</supportedProfiles>
<extensions>
<extensionID>NativeExtHelloWorld</extensionID>
</extensions>
</application>
Я использую Flex (4.6.0), объединенный с AIR SDK (22.0.0).
Я сделал что-то не так? Что поможет мне решить эту проблему?
Еще раз прошу прощения, что опубликовал довольно много кода; Я попытался сократить до наиболее актуальных.
Заранее спасибо!
helloWorld
класса расширения AS3. В свою очередь (как показывает код AS3 на шаге 2) эта функция вызывает собственную функциюhelloWorld
. Таким образом, я вызываю нативную функцию. Что касается назначения C ++, я не думаю, что это неправильно, поскольку я в основном повторно использовал код в Пример Adobe. - person AnthonyD973   schedule 17.08.2016const uint8_t*
не соответствует таблице ANSI ... Я должен это проверить. - person AnthonyD973   schedule 17.08.2016const uint8_t*
в двоичный файл. Принуждение правильно; он также следует за таблицей ASCII и заканчивается символом NULL. - person AnthonyD973   schedule 17.08.2016