AIR 3 Android原生扩展 - 我可以/如何包含第三方库?

11

在AIR 3中,与本地扩展支持有关的所有新热点话题中,我没有找到任何证实或否认在本地Android实现中包含和使用外部JAR文件的可能性的事情。

所有的示例基本上展示了连接内置Android API的能力。但是如果有人想使用数百个使它更加容易的库呢?当然这似乎是可能的。我将尝试概述我所做的,并希望有人能发现问题:

  1. 成功创建了本地Android库,使用来自第三方Android库XYZ的编译导入。
  2. 将Android项目导出为JAR文件。注意:引用的第三方JAR文件在jar文件内的/lib目录下。
  3. 成功创建了用于与本地Android库进行交互的ActionScript库(SWC)。
  4. 从SWC中提取的platform Android-ARM的library.swc、extension.xml、Android JAR文件,创建ANE包。
    注意:已经尝试过将第三方库放在此处概述的文件结构中: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. 可以成功看到AIR应用程序在LogCat中加载(和跟踪语句)"ActivityManager: Displayed com.me.androidapp/.AppEntry"
  8. 可以看到AIR应用程序通过运行时成功调用本地Android Java代码以实例化扩展和上下文。"mye_native: MyExtension.initialize", "mye_native: MyExtensionContext.createContext"
  • 当AIR应用程序尝试调用本地函数时,它会崩溃,无法找到第三方Android库中的类:E dalvikvm:Could not find class 'com.thirdparty.SomeClass',referenced from method com.me.nativeExtentions.MyExtensionFunction.call
  • 有什么想法吗?看起来应该可以这样工作。

    我注意到一件事,当我从我的一个纯Java Android应用程序(也包含第三方android库)中分离APK和Dex时,它似乎已经将第三方类包含在内了(不只是一个jar引用)。 当我对我的Flex APK进行相同的操作时,我发现只有自己的Java类加上Adobe的类,第三方的类似乎无处可寻。

    我已经在Adobe论坛上发布了这个问题,但我想试试SO社区的智慧。谢谢。


    我也遇到了同样的问题,希望有知道答案的人能注意到这个问题! - brybam
    2个回答

    5
    你需要将所有的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的EULA是否都支持这样做。 - Derek Bromenshenkel
    另一种将JAR文件组合的替代方法是将第三方JAR文件提取到某个地方,然后在主Android项目中创建一个“classes”文件夹引用它。 - Derek Bromenshenkel
    @DerekBromenshenkel,你能详细说明一下这个替代方案吗?我已经提取了jar文件,并将包含类的文件夹添加到ANE本地项目中(使用“添加外部类文件夹”),而不是直接添加jar文件;但是项目根本无法编译,它找不到这些类...... - matteo
    似乎这应该可以工作。我尝试了一下,将两个JAR文件合并成一个扩展JAR文件,并生成了最终的Flex APK,但我的应用程序崩溃了,因为它找不到第三方类。当我提取合并的JAR文件时,我看到第三方文件夹在应该的位置。你有什么想法吗?我猜测这些类没有以某种方式被转换为dex代码。 - devanshu_kaushik

    3

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


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接