Adobe ANE 适用于 iOS 和 Android 设备,但不适用于 AIR 模拟器

Posted

技术标签:

【中文标题】Adobe ANE 适用于 iOS 和 Android 设备,但不适用于 AIR 模拟器【英文标题】:Adobe ANE works on iOS and Android devices, but not in AIR simulator 【发布时间】:2013-04-18 13:39:54 【问题描述】:

Adobe 的vibration ane 在 iosandroid 上的 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 

同时:

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

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

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

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

2016 年更新:

Adobe 已更新其 Vibration native extension (ANE) sample 以支持 64 位。

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢迈克尔,我已经注意到你的 ANE 并考虑购买它们。您的 Vibration ANE 是否支持黑莓?另外,为什么您的 Vibration ANE 被列为不支持 iPod Touch? 我们还没有实现对黑莓的支持,实际上我们还没有对此提出任何要求。 iPod Touch 不支持振动,因为该设备没有振动硬件。干杯 您的方法对我有用,无需在 Xcode 和 Android Eclipse 中重建任何内容:我从 Adob​​e 的 ReadyToUseExtension\com.adobe.extensions.Vibration.ane 中提取了 VibrationAndroidLibrary.jarlibVibrationiOSLibrary.a。我也省略了 adt 命令的-storetype pkcs12 -keystore YOUR_SIGNING_KEY.p12 -storepass KEY_PASSWORD 部分。【参考方案2】:

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

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

将调用 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
    

【讨论】:

很遗憾,您的方法不适用于 Adob​​e Vibration ANE。【参考方案3】:

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

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

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

【讨论】:

一个更好的解决方案 - 我刚刚与一名开发人员签约,为振动通道添加一个“默认库”实现......现在我可以在调试模式下毫无问题地使用它。随意使用:dropbox.com/s/qwvcbsx6ymrx8rz/… 您仍然使用默认库 Bernd 的 Vibration ANE? Dropbox 链接不再有效。非常感谢! 我停止了该应用程序,并且我的文件在存档备份中。 Buttt,如果我是你,我会选择 distriqt 振动 ane - airnativeextensions.com/extension/com.distriqt.Vibration - 只需 10 美元。使用笨重的旧固定鞋面没有意义

以上是关于Adobe ANE 适用于 iOS 和 Android 设备,但不适用于 AIR 模拟器的主要内容,如果未能解决你的问题,请参考以下文章

Flash ANE iOS关于Flash ANE在iOS上面遇到的一些问题

使用 Milkman Games 的 AdMob ANE 看不到广告 [Adobe AIR]

适用于 IOS 的摄像机本机扩展

适用于 AIR Android 应用程序的 Chromecast 和 ANE - 访问 android.os

Android:使用 ANE (EasyPush) 时,Adobe 在启动时崩溃

Adobe AIR ANE 中的 FragmentActivity