4

我有一个正在编译到移动设备的 AIR 应用程序。有一个 iOS 原生扩展 ( JamPot MobileBackup ) 在 IDE 中使用时可以正常编译。

但是,由于我们正在转向支持其他平台,IDE 还不够,我决定构建一个 Ant 脚本来运行构建过程。

问题是这个特定的 ANE 似乎在扩展代码中定义 MobileBackup 类,而不是像我正在使用的其他 ANE 那样在单独的 .as 文件中定义。

这是我看到的错误:

[mxmlc] Loading configuration file /Users/anderson/src/flex/4.6.0/frameworks/airmobile-config.xml
[mxmlc] /Users/anderson/src/xxx/src/xxx/Utility.as(32): col: 35 Error: Type was not found or was not a compile-time constant: MobileBackup.
[mxmlc] 
[mxmlc]         private static var mobileBackup:MobileBackup = new MobileBackup();
[mxmlc]                                         ^
[mxmlc] 
[mxmlc] /Users/anderson/src/xxx/src/xxx/Utility.as(32): col: 54 Error: Call to a possibly undefined method MobileBackup.
[mxmlc] 
[mxmlc]         private static var mobileBackup:MobileBackup = new MobileBackup();
[mxmlc]                                                            ^
[mxmlc] 
[mxmlc] /Users/anderson/src/xxx/src/xxx/Utility.as(32): col: 54 Error: Call to a possibly undefined method MobileBackup.
[mxmlc] 
[mxmlc]         private static var mobileBackup:MobileBackup = new MobileBackup();
[mxmlc]                                                            ^
[mxmlc] 
[mxmlc] /Users/anderson/src/xxx/src/xxx/Utility.as(21): col: 35 Error: Definition ie.jampot.nativeExtensions:MobileBackup could not be found.
[mxmlc] 
[mxmlc]     import ie.jampot.nativeExtensions.MobileBackup;

mxmlc 调用如下所示:

<mxmlc 
   file="${app.main.class.file}" 
   output="${build.output.swf.file}" 
   locale="${LOCALE}" 
   static-rsls="false" 
   accessible="false" 
   configname="airmobile" 
   debug="${build.debug.mode}" 
   failonerror="true" 
   fork="true" 
   maxmemory="512m">
  <source-path path-element="${app.src.path}"/>
  <compiler.library-path dir="${FLEX_HOME}/frameworks" append="true">
<include name="libs/*" />
  </compiler.library-path>
  <library-path file="${FLEX_HOME}/frameworks/locale/${LOCALE}" append="true"/>
  <library-path dir="${spicelib.lib.path}" includes="*.swc" append="true"/>
  <library-path dir="${parsley.lib.path}" includes="*.swc" append="true"/>
  <library-path dir="${app.lib.path}" includes="*.swc" append="true"/>
  <external-library-path file="${AIR_GLOBAL}" append="true"/>
  <external-library-path dir="${app.ane.path}" includes="*.ane" append="true"/>
  <define name="CONFIG::DESKTOP" value="${output.config.environment.desktop}"/>
  <define name="CONFIG::IOS" value="${output.config.environment.ios}"/>
  <define name="CONFIG::ANDROID" value="${output.config.environment.android}"/>
  <define name="CONFIG::PRODUCTION" value="${output.config.environment.production}"/>
  <define name="CONFIG::STAGING" value="${output.config.environment.staging}"/>
  <define name="CONFIG::LOCAL" value="${output.config.environment.local}"/>
</mxmlc>

其中 app.ane.path 是项目的 .ane 文件集合的路径。

我也尝试过使用库路径而不是外部库路径。

除了添加 build.xml 之外,我根本没有更改 Flash Builder 项目的布局或内容,它仍然可以在 IDE 中正常编译。

我需要做什么才能让它在 IDE 之外编译?

4

5 回答 5

4

我把这一切都输入了,并决定在发布之前再尝试一次。我想通了,所以我会在这里为其他人发布结果。

Flash Builder 必须将 SWC 从 ANE 中提取出来以供 mxmlc 使用。我在其他地方找到了 SWC 的副本,并将其添加到我的 libs 文件夹中,嘿,很快,它可以工作了。

于 2012-06-20T04:13:42.037 回答
3

我无法解释为什么,但是如果您复制并重命名您的 .ane 文件并将它们更改为 .swc 文件(字面意思是复制和重命名,没有转换),然后将 ANE 的目录作为外部库路径引用 - 它可以工作。

<compiler.external-library-path dir="${ANE_DIR}" includes="*.swc" append="true" />
于 2013-02-08T14:46:37.967 回答
1

我查看了 mxmlc Ant Task 的源代码,它明确忽略了任何不是 *.swc 的文件。我在 github 上分叉了 apache/flex-sdk 并修复了它,以便 mxmlc 接受 *.swc 和 *.ane。您可以在https://github.com/leapingbytes/flex-sdk克隆固定版本(要构建固定的 ant 任务 jar,请转到 modules/antTasks 并运行 ant)。

于 2014-01-23T06:46:04.593 回答
1

正如其他人发布的那样,mxmlc 将忽略 *.swc 以外的任何文件扩展名以进行链接。我通过将所有 .ane 文件复制到临时目录,将它们命名为 .swc 然后调用 mxmlc 来解决这个问题:

<!-- Copy all ANE files to temp SWC files because mxmlc only accepts SWC for linkage -->
<copy todir="${basedir}/temp-swc" overwrite="true">
    <fileset dir="${basedir}/_extensions"/>
    <globmapper from="*.ane" to="*.swc"/>
</copy>

<mxmlc
    <!-- ... --> >

    <!-- ... -->

    <external-library-path dir="${basedir}/temp-swc" includes="*.swc" append="true"/>
</mxmlc>

<!-- Remove temporary SWC files after usage -->
<delete dir="${basedir}/temp-swc" />
于 2019-02-28T14:25:42.173 回答
0

我直接使用java任务。

当我将 ane 文件的绝对路径附加到-library-path选项(别名-l)时,它可以工作。

但是,它不能在 mxmlc 任务中工作。

<java jar="${FLEX_HOME}/lib/mxmlc.jar" fork="true" failonerror="true" dir="${FLEX_HOME}/frameworks">
<arg value="-o=${basedir}/${swf.file}"/>
<arg value="-load-config=airmobile-config.xml"/>
<arg value="-l+=${basedir}/${LIB_DIR}"/>
<arg value="-l+=${basedir}/${ANE_DIR}/us.sanguo.ios.ane" />
<arg value="-debug=false"/>
<arg value="-optimize=false"/>
<arg value="${basedir}/${main.file}"/>
</java>
于 2013-05-30T16:38:20.497 回答