11

在 AIR 3 中围绕原生扩展支持的所有新炒作中,我还没有发现任何东西可以确认或否认可以在原生 Android 实现中包含和使用外部 JAR。

所有示例基本上都展示了与内置 Android API 挂钩的能力。但是,如果有人想使用数百个使其更容易的库之一怎么办?当然,这似乎应该是可能的。我将尝试概述我所做的事情,也许有人会发现一个缺陷:

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

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

我注意到的一件事是,当我将 APK 和 Dex 从我的纯 Java Android 应用程序(也有第 3 方 android 库)中分离出来时,似乎第 3 方的类已包含在其中(不仅仅是jar 参考)。当我用我的 Flex APK 做同样的事情时,我发现只有我自己的 Java 类和 Adob​​e 的类,并且找不到我可以看到的第 3 方类。

我在 Adob​​e 论坛上发布了这个,但我想我会尝试一下 SO 智囊团。谢谢你。

4

2 回答 2

5

你必须把所有的罐子合二为一。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 中的每个顶级包重复第二个命令。)

于 2011-11-01T20:37:49.510 回答
3

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

于 2012-08-08T17:38:46.837 回答