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

时间:2013-04-24 20:29:12

标签: air flex4 flash-builder flex-mobile air-native-extension

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

enter image description here

enter image description here

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

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. Adob​​e的另一个ANE - Adobe Gaming SDK附带的GameCenter.ane与AIR Simulator完美配合

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

  3. 有没有办法让这项工作更舒服?

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

    2016年更新:

    Adob​​e已使用64位支持更新了他们的Vibration native extension (ANE) sample

3 个答案:

答案 0 :(得分:3)

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

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

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

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

首先,您需要编译现有项目,Android lib,iOS lib和现有的actionscript库,以生成 VibrationAndroidLibrary.jar libVibrationiOSLibrary.a VibrationActionScriptLibrary.swc 分别。

然后你需要创建另一个actionscript库,并复制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命令所需的位置。请注意这里的路径等,我假设您已将默认的lib放在 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,带有一个默认的lib,这将使它更有用!就个人而言,我不认为没有它就应该释放ANE。

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

答案 1 :(得分:1)

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

  • 创建一个实用程序类,它返回您是否在支持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
    }
}

答案 2 :(得分:1)

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

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

它是笨重的,但它使得与宜居者合作。让我无可厚非,adobe还没有解决这个问题。