6

Adobe的振动 ane在 iOS 和 Android 上的 Flex 移动应用程序中运行良好,但是当我尝试在 Windows 7 上从 Flash Builder 4.7 启动 AIR 模拟器时出现错误:

在此处输入图像描述

在此处输入图像描述

这是后一个屏幕截图中错误消息的副本:

Process terminated without establishing connection to debugger.

The content cannot be loaded because there was a problem loading an extension: Error: Requested extension com.adobe.Vibration is not supported for Windows-x86.

Launch command details:  "C:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\sdks\4.6.0 (AIR 3.5)\bin\adl.exe" -runtime "C:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\sdks\4.6.0 (AIR 3.5)\runtimes\air\win" -profile extendedMobileDevice -screensize 640x920:640x960 -XscreenDPI 326 -XversionPlatform IOS -extdir "C:\Users\xxx\Adobe Flash Builder 4.7\.metadata\.plugins\com.adobe.flexbuilder.project.ui\ANEFiles\MyApp-Mobile\win32\" C:\Users\xxx\Documents\MyApp\mobile\bin-debug\MyApp-app.xml C:\Users\xxx\Documents\MyApp\mobile\bin-debug 

同时:

  1. Adobe 的另一个 ANE - Adob​​e Gaming SDK中包含的 GameCenter.ane可与 AIR 模拟器完美配合

  2. 当我选择 BlackBerry AIR 模拟器时,上面提到的 com.adobe.extensions.Vibration.ane 不会失败(但 iOS 和 Android AIR 模拟器不起作用)。

有没有办法让这项工作更舒适?

我想在我的 Flex 移动应用程序中使用 com.adobe.extensions.Vibration.ane,但我也想使用 AIR 模拟器 - 无需注释源代码并从项目属性中删除该 ANE。

2016 年更新:

Adobe 已更新其Vibration 本机扩展 (ANE) 示例,支持 64 位。

4

3 回答 3

3

ANE 的问题在于它不是一个完整的实现。最重要的是,ANE 没有实现默认的回退实现,如果当前平台没有特定的实现,设备将回退到的默认回退实现。

这使得 ANE 很难在跨平台开发中使用,因为它在某些情况下会失败。任何未明确包含的平台都将因您收到的消息而失败。

基本上,如果您自己不更改 ANE,您将无法按预期使用它。您唯一的方法是进行一些条件样式编译,而不是在模拟器中调用 ANE。

如果您确实希望更改 ANE,那么最好的选择是实现默认库。这很简单,但您需要:XCode、带有 Android 开发工具的 eclipse,以及来自 AIR SDK 的 adt。

首先,您需要编译现有项目,Android 库、iOS 库和现有的动作脚本库,以分别生成VibrationAndroidLibrary.jarlibVibrationiOSLibrary.aVibrationActionScriptLibrary.swc

然后,您需要创建另一个动作脚本库,并复制 com.adobe.nativeExtensions.Vibration 类,如下所示:

public class Vibration
{
    public function Vibration()
    {
    }

    public static function get isSupported():Boolean
    {
        return false;
    }

    public function vibrate(duration:Number):void
    {
    }
}

在未实现扩展而不是您收到上述消息的情况下,此类将替换其他类。

然后我们需要将默认定义添加到extension.xml文件中:

<extension xmlns="http://ns.adobe.com/air/extension/2.5">
    <id>com.adobe.Vibration</id>
    <versionNumber>1</versionNumber>
    <platforms>
        <platform name="Android-ARM">
            <applicationDeployment>
                <nativeLibrary>VibrationAndroidLibrary.jar</nativeLibrary>
                <initializer>air.extensions.VibrationExtension</initializer>
                <finalizer>air.extensions.VibrationExtension</finalizer>
            </applicationDeployment>
        </platform>
        <platform name="iPhone-ARM">
        <applicationDeployment>
            <nativeLibrary>libVibrationiOSLibrary.a</nativeLibrary>
            <initializer>ExtInitializer</initializer>
            <finalizer>ExtFinalizer</finalizer>
            </applicationDeployment>
        </platform>

        <platform name="default"> 
            <applicationDeployment /> 
        </platform>

    </platforms>
</extension>

然后我们需要使用新的默认动作脚本 SWC 重新编译 ANE。假设您位于上述 ANE 的VibrationNEDeliverables目录中,您可以将其输入到 bash 文件中并运行它,或者将其全部放在命令行中的一行上)。前几行只是提取 library.swf 文件并将其移动到 package 命令所需的位置。请注意此处的路径等,我假设您已将默认库放在VibrationActionScriptDefaultLibrary中,但您需要适当地更改它。

unzip -o -d VibrationActionScriptLibrary/bin VibrationActionScriptLibrary/bin/VibrationActionScriptLibrary.swc
unzip -o -d VibrationActionScriptDefaultLibrary/bin VibrationActionScriptDefaultLibrary/bin/VibrationActionScriptDefaultLibrary.swc 

cp VibrationActionScriptLibrary/bin/library.swf VibrationiOSLibrary/build/Release-iphoneos/.
cp VibrationActionScriptLibrary/bin/library.swf VibrationAndroidLibrary/bin/.

adt -package \
    -storetype pkcs12 -keystore YOUR_SIGNING_KEY.p12 -storepass KEY_PASSWORD \
    -target ane com.adobe.extensions.Vibration.ane VibrationActionScriptLibrary/src/extension.xml \
    -swc VibrationActionScriptLibrary/bin/VibrationActionScriptLibrary.swc \
    -platform iPhone-ARM  -C VibrationiOSLibrary/build/Release-iphoneos . \
    -platform Android-ARM -C VibrationAndroidLibrary/bin . \
    -platform default -C VibrationActionScriptDefaultLibrary/bin .

完成后,您现在应该拥有一个带有默认库的新版本的 ANE,这将使其更有用!就我个人而言,我认为没有它就不应该发布 ANE。

如果您需要功能齐全的 ANE,可以查看我们的: http: //distriqt.com/native-extensions

于 2013-05-01T09:01:08.000 回答
1

我过去使用的解决方案是这样的:

  • 创建一个实用程序类,该类返回您是否在支持 ANE 的设备上运行。在我的例子中,该类包含一个检查Capabilities.os. 在此处查看它可以返回的值列表。

  • 将调用 ANE 方法的代码放入它们自己的函数中,如果支持 ANE,则调用此函数。如果我没记错的话,有必要将使用 ANE 的代码放在单独的函数中,而不仅仅是在 if 块中,否则模拟器中会出现同样的错误:

做这个:

public function doSomethingThatWillUseANE():void
{
    if (DeviceCapabilities.supportsANE) // static utility class
    {
        methodThatUsesANE();
    }
}

private function methodThatUsesANE()
{
    // execute actual ANE method here
}

而不是像这样在一个函数中完成所有操作:

public function doSomethingThatWillUseANE():void
{
    if (DeviceCapabilities.supportsANE) // static utility class
    {
        // execute actual ANE method here
    }
}
于 2013-04-28T17:12:54.627 回答
1

为 ios 64 位兼容性而构建的最新振动 ane 也存在同样的问题。我的解决方法是将 ane 导入语句放在实际调用 vibrate 方法的函数中,并在 android 和 ios 的项目构建路径设置中取消选中 ane 的包含框。

我的应用程序中有一个标志变量(由单独的函数设置),用于标记应用程序是否正在 ide 中运行。如果标志设置为非IDE模式,使用振动的视图只会调用上述振动函数。运行 ide 模拟器时,我仍然收到初始警告,但不是严重错误。当我进行发布构建时,FlashBuilder 会强制我在适用的项目构建路径设置中选中 ane 的包含框(下次我想运行模拟器时必须再次取消选中它)。

它很笨重,但它使与 ane 一起工作变得宜居。土坯没有解决这个问题,这让我无所适从。

于 2015-05-06T20:15:13.853 回答