Adobe AIR:错误 #3500

Posted

技术标签:

【中文标题】Adobe AIR:错误 #3500【英文标题】:Adobe AIR: Error #3500 【发布时间】:2016-12-23 13:02:24 【问题描述】:

编辑:我终于能够制作“Hello, World!”项目集。如果您也遇到Error #3500 问题,请参阅my answer below 以获取工作项目集。

我目前正在制作“Hello, World!”带有 FlashDevelop 的 Adob​​e AIR 原生扩展。因此,我的 Native Extension 旨在供我正在编程的 Windows-x86 平台使用。

我通过(自定义)批处理文件构建了 ANE。使用该 ANE 的测试 AIR 应用程序编译得很好,但是,就像我看到的许多其他人的帖子一样,我收到了 Error #3500: The extension context does not have a method with the name helloWorld.

三天来我一直试图了解发生了什么,尽管解决了几个原因,但我仍然遇到同样的错误。

似乎应用程序运行时实际上从未调用过initializeExtension 函数,因为 DebugView 不跟踪任何内容,即使我的初始化程序使用了OutputDebugString(L"Extension initialized");

发了很多代码感觉有点不好意思,但是看了三天,看了几十个网页,就是不知道问题出在哪里了。

无论如何,应用程序构建分 3 步完成:

1) 在 Visual Studio 中使用 Release 标志构建 DLL。我在下面发布该代码作为对 Michael 评论的回应,但是,我不确定错误是否来自那里。

我的native端主要由一个header和一个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"));
        

    


反过来,在将我的 Visual Studio 文件夹中的 DLL 和 library.swf(我从 SWC 中提取)复制到 ANE Build Files\platforms\Windows-x86 之后,我使用 adt 构建 ANE。变量展开后,命令如下:

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>

我正在使用与 AIR SDK (22.0.0) 合并的 Flex (4.6.0)。

我做错了什么吗?什么可以帮助我解决这个问题?

再次抱歉,我发布了很多代码;我已经尝试精简到最相关的内容。

提前致谢!

【问题讨论】:

嗨,该错误通常表明本机代码存在问题,因为您尚未声明该方法。能否贴出原生端初始化扩展上下文的代码? @Michael 按照你的要求,我添加了我的本地代码。 即使您的 ANE 代码完全错误,也不会出现编译错误,除非您尝试在 ANE 中调用某些内容。似乎扩展的 actionscript 部分在您的 C++ 代码中找不到 helloWorld 函数。我对C++一无所知,但我猜你在initializeContext中所做的函数声明出了点问题。也许函数[0].name = (const uint8_t*)"helloWorld";部分错了? @Philarmon 我的应用程序调用 AS3 扩展类的 helloWorld 函数。反过来(如步骤 2 中的 AS3 代码所示),该函数调用本机 helloWorld 函数。因此,我正在调用本机函数。至于C++的赋值,我觉得没有错,因为我基本上复用了Adobe's example中的代码。 @Philarmon 除非强制转换为 const uint8_t* 不遵循 ANSI 表...我应该检查一下。 【参考方案1】:

我已经以某种方式解决了这个问题,现在一切正常。我试着回去看看我做错了什么,但我无法弄清楚。我的猜测是复制和解压缩 ANE 的批处理文件之一使用了错误的目标,所以我最终使用了相同的旧 ANE,而不是使用我正在构建的 ANE(我真傻)。

应 Colonize.bat 的请求,here is a working Hello, World! example。我使用 VisualStudio 2013 和 FlashDevelop 来制作这个。

您可以在以下文件中找到几个错误 #3500 的原因:

1_Build_DLL/Hello World/main.cpp 2_Build_ANE/lib/descriptor.xml 2_Build_ANE/src/HelloWorldExtension.as

我读到(或遇到!)的其他一些错误的原因,在其他文件中也有说明。事实上,自定义批处理文件指示了制作和使用您自己的 ANE 所要遵循的程序。

注意:不要尝试直接从这些文件构建。我使用批处理文件是为了不必手动运行命令和复制/粘贴/解压缩文件,因此目标和环境变量在您的计算机上无效。

【讨论】:

您认为您可以提供该项目的转储供其他人查看吗?我目前正在第 4 天找出 #3500 错误,并且非常纠结于原因和位置。 @Colonize.bat 是的,这很烦人,不是吗?当然,我可以做到。但是,由于我从头开始制作项目的次数,我有几个半工作文件。给我几天时间,我会上传一个工作项目集。 @Colonize.bat 抱歉耽搁了;这几天我很忙。您可以在上面答案的链接中找到一个工作项目集。

以上是关于Adobe AIR:错误 #3500的主要内容,如果未能解决你的问题,请参考以下文章

Flex / adobe air 错误收集服务

为什么我的Adobe Air应用程序出现错误#2032?

Adobe Air iOs 包含“资源”文件夹时出现打包错误。为啥?

Flash Builder、Adobe AIR 和 iOS 开发的包检查失败错误

Adobe Air:版本号不是以数字开头

Adobe AIR 无法在 iOS 上加载 PDF