适用于Android的AIR 3原生扩展程序 – 可以/如何包含第三方库?

随着围绕AIR 3中的本机扩展支持的所有新的炒作,我还没有find确认或否认可以在本机Android实现中包含和使用外部JAR的单一事物。

所有这些示例基本上都展示了嵌入内置Android API的能力。 但是,如果有人想要使用数百个库中的一个使其变得更容易呢? 当然看起来这应该是可能的。 我将尝试概述我所做的事情,也许有人会发现一个缺陷:

  1. 使用第三方Android库XYZ的编译导入成功创建了原生Android库。
  2. 导出的Android项目为JAR文件。 注意:引用的第三方JAR位于jar内的/ lib中。
  3. 成功创建了ActionScript库(SWC)以与本机Android库进行交互。
  4. 从SWC,extension.xml,Android JAR和library.swc创建ANE包(用于从SWC中提取的平台Android-ARM)。
    注意:还尝试将第三方库放在此处概述的文件结构中: http ://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-24823354 12ffea65006-8000.html#WSf268776665d7970d-6be13ace1308aaebeca-7fff。 我认为这更适合使用JNI或其他任何运行时types执行,所以这篇文章让我有点困惑。
  5. 在示例Flex Mobile项目中使用ANE。
  6. 在测试DroidX设备上构建并安装APK文件。
  7. 可以在LogCat "ActivityManager: Displayed com.me.androidapp/.AppEntry"成功查看AIR应用程序加载(和跟踪语句)
  8. 可以成功地看到AIR应用程序通过运行时调用本机Android Java代码来实例化扩展和上下文。 "mye_native: MyExtension.initialize", "mye_native: MyExtensionContext.createContext"
  9. 一旦AIR应用程序尝试调用本机函数,它就会爆炸,无法从第三方Android库中E dalvikvm: Could not find class 'com.thirdparty.SomeClass', referenced from method com.me.nativeExtentions.MyExtensionFunction.callE dalvikvm: Could not find class 'com.thirdparty.SomeClass', referenced from method com.me.nativeExtentions.MyExtensionFunction.call

有任何想法吗? 它似乎应该以这种方式工作。

我注意到的一件事是,当我从我的纯Java Android应用程序(也有第三方安卓库)中分离出APK和Dex时,看起来第三方的类已包含在其中(不仅仅是jar参考)。 当我使用我的Flex APK做同样的事情时,我发现只有我自己的Java类和Adobe的,而第三方的那些无处可寻,我可以看到。

我在Adobe论坛上发布了这个,但我想我会试试SO智囊团。 谢谢。

你必须将所有的jar子合二为一。 像http://code.google.com/p/jarjar/或您自己的Ant脚本之类的东西会有所帮助。

编辑添加示例:假设您的主扩展jar文件是extension.jar,并且您正在使用external.jar中的代码。 然后,您可以使用Java jar工具将来自external.jar的类放入extension.jar:

jar -xf external.jar

这会将.class文件解压缩到包文件夹中。 如果顶级包是“com”,那么您可以使用以下命令将它们添加到extension.jar:

jar -uf extension.jar com

(对外部jar中的每个顶级包重复第二个命令。)

您还可以手动组合库jar,将它们转换为zip文件(只需将它们重命名为.zip),然后将类从第三方库复制到主库中,并将其重命名为.jar