EDIT: Я, наконец, смог сделать «Привет, мир!». проект. Если у вас также есть проблемы Error #3500
, см. my answer below для рабочего набора проектов.Adobe AIR: Ошибка # 3500
В настоящее время я делаю «Привет, мир!». Родное расширение для Adobe AIR с FlashDevelop. Таким образом, My Native Extension используется для использования на платформах Windows-x86, на которых я программирую.
Я построил ANE через (пользовательский) пакетный файл. Тестирование AIR Application, которое использует этот 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 просил, here is the build log при строительстве 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 из моей визуальной папки студии и 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 Projectors.
Обратите внимание, что если я получаю сообщение об ошибке # 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).
Я сделал что-то не так? Что поможет мне решить эту проблему?
Еще раз, извините, что я написал довольно много кода; Я пробовал подрезать то, что было наиболее актуальным.
Заранее благодарен!
Привет, Эта ошибка обычно указывает на проблему с нативным кодом, поскольку вы не объявили этот метод. Можете ли вы опубликовать код для инициализации контекста расширения на внутренней стороне? – Michael
@Michael Как вы просили, я добавил свой собственный код. –
Ошибок компиляции не будет, даже если ваш код ANE совершенно не прав, если вы не попытаетесь вызвать что-то в своем ANE. Кажется, что часть actionscript расширения не может найти функцию helloWorld в вашем коде на C++. Я понятия не имею о C++, но я бы предположил, что что-то пошло не так в ваших объявлениях функций, которые вы выполняете в initializeContext.Возможно, функции [0] .name = (const uint8_t *) «helloWorld»; часть ошибочна? – Philarmon