android - 链接到外部 JAR 库时使用 DexClassLoader 进行反射

标签 android plugins dex

我正在尝试为 Android 应用程序构建一个插件架构。我有一个主机应用程序,它将检查 apk“插件”文件的目录,将它们加载到 DexClassLoader 中,并调用一个方法来获取 DerivedLibraryObjects 数组。

我认为问题在于 DerivedLibraryObject 扩展了包含在外部 JAR 库中的基类。所以宿主和插件都引用了这个 JAR。当我尝试获取 DerivedLibraryObjects 数组时,出现以下异常:

04-01 14:26:57.996: ERROR/AndroidRuntime(23386): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

据我所知,这意味着插件中的对象与主机中的对象不匹配。但是,宿主应用程序和插件应用程序都链接到同一个 jar 文件的副本。如果我返回一个简单地扩展 Object 的对象,那么代码可以正常工作,但是一旦我开始处理 DerivedLibraryObject,它就会抛出这个错误。

有人有什么建议吗?

最佳答案

我可以回答我自己的问题 - 问题在于主机和插件都包含外部 jar 库,因此当类加载器发现同一类有两个版本时,它会退出。

您可以做的是通过将所有内容编译为类文件(我让 Eclipse 这样做)来手动构建您的插件,然后使用 dex 构建 jar/apk,方法是:

dx --dex --output=<outputdir>\plugin.jar <projectpath>\bin\

projectpath 是您的 android 项目的根目录。当您进入 bin 目录时,应该可以找到您的类文件。

如果有人可以发布一个 ant 脚本来执行此操作,那么添加到这个问题中将是一件好事。

关于android - 链接到外部 JAR 库时使用 DexClassLoader 进行反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5517435/

相关文章:

android - java.lang.NoClassDefFoundError : com. acme.R$layout 引用 android 库

javascript - 传单 map 似乎缺少建筑物。有什么选择?

eclipse - 是否可以根据已提交的更改在 Eclipse 中创建补丁?

android - 修改 android.jar 类并在 Android 设备中替换它?

Android:在 Intel 设备上运行仅 armeabi 应用程序

Android 服务 mysql - 检查数据库更改

java - 使用 JOGL 和 Android OpenGL 编写可移植的 Java 应用程序

eclipse - 找不到所需的插件 'org.eclipse.pde.junit.runtime'

Android dexindexoverflow异常

java - 来自 APK 的源代码