适用于 Android 的 AIR 3 Native Extensions - 我/如何包含第 3 方库?

Posted

技术标签:

【中文标题】适用于 Android 的 AIR 3 Native Extensions - 我/如何包含第 3 方库?【英文标题】:AIR 3 Native Extensions for Android - Can I/How to include 3rd party libraries? 【发布时间】:2011-12-05 16:09:52 【问题描述】:

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

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

    使用来自第 3 方 Android 库 XYZ 的编译导入成功创建了原生 Android 库。 将 Android 项目导出为 JAR 文件。 注意:引用的第 3 方 JAR 位于 jar 内的 /lib 中。 已成功创建 ActionScript 库 (SWC) 以与原生 Android 库交互。 从 SWC、extension.xml、Android JAR 和 library.swc(用于平台 Android-ARM,从 SWC 中提取)创建了 ANE 包。 注意:还尝试将第 3 方库放入此处概述的文件结构中:http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html#WSf268776665d7970d-6be13ace1308aaebeca-7fff。我认为这更适合使用 JNI 或其他方式执行运行时类型,所以那篇文章让我有点困惑。 在 Flex Mobile 项目示例中使用了 ANE。 在测试 DroidX 设备上构建并安装 APK 文件。 可以在 LogCat "ActivityManager: Displayed com.me.androidapp/.AppEntry" 中成功查看 AIR 应用程序加载(和跟踪语句) 可以成功地看到 AIR 应用程序通过运行时调用本机 Android Java 代码来实例化扩展和上下文。 "mye_native: MyExtension.initialize", "mye_native: MyExtensionContext.createContext" 只要 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 智囊团。谢谢。

【问题讨论】:

我也遇到了同样的问题,希望知道答案的人注意这个问题! 【参考方案1】:

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

【讨论】:

我发现这也是真的。我不确定第 3 方 JAR 的 EULA 是否都支持这样做。 组合 JAR 的另一种方法是在某处提取第 3 方 JAR,然后在主 Android 项目中创建一个“类”文件夹引用。 @DerekBromenshenkel 您可以扩展该替代方案吗?我已经提取了 jar,并将包含类的文件夹添加到 ANE 的本机项目(使用“添加外部类文件夹”)而不是 jar 文件本身;但是项目根本没有编译,它没有找到类............ 看起来应该可以。我尝试了它并将两个 JAR 合并到一个扩展 jar 文件中制作了最终的 flex apk,但我的应用程序崩溃了,因为它找不到第三方类。当我提取组合的 JAR 文件时,我看到第三方文件夹是它应该在的位置。关于我可能遗漏的任何想法?我的猜测是这些类没有以某种方式转换为 dex 代码。【参考方案2】:

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

【讨论】:

以上是关于适用于 Android 的 AIR 3 Native Extensions - 我/如何包含第 3 方库?的主要内容,如果未能解决你的问题,请参考以下文章

适用于 Android 的 Upnp 本机扩展 - AIR

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

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

适用于 Android 应用 (AS3) 的 Chromecast 和 Air

如何使用适用于 Android 的 Adob​​e AIR 设置 Admob

css iPhone 6 Plus和iPad Air 2媒体查询(Retina HD显示屏)。也适用于类似的Android设备。