2

我想在我的案例 JadeAndroid.jar 中加载使用外部库编译的 Android 中的类(使用 dexClassLoader)。此类(dex)在包含所有 JadeAndroid 类的 jar 中导出(我正在使用 ant 脚本)。我的类扩展了玉类行为。当我加载这个类时,我有一个例外:

09-03 21:53:05.319: W/dalvikvm(23201): Class resolved by unexpected DEX:Lcom/example/dex/lib/LibraryProvider;(0x40d80838):0x411aa8 ref[Ljade/core/behaviours/Behaviour;] Ljade/core/behaviours/Behaviour;(0x40d81d18):0x419158
09-03 21:53:05.319: W/dalvikvm(23201): (Lcom/example/dex/lib/LibraryProvider; had used a different Ljade/core/behaviours/Behaviour; during pre-verification)
09-03 21:53:05.319: W/dalvikvm(23201): Unable to resolve superclass of Lcom/example/dex/lib/LibraryProvider; (337)
09-03 21:53:05.319: W/dalvikvm(23201): Link of class 'Lcom/example/dex/lib/LibraryProvider;' failed
09-03 21:53:05.319: W/System.err(23201): ***  Uncaught Exception for agent buyer1  ***
09-03 21:53:05.319: W/System.err(23201): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
09-03 21:53:05.319: W/System.err(23201):    at dalvik.system.DexFile.defineClass(Native Method)
09-03 21:53:05.329: W/System.err(23201):    at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:195)
09-03 21:53:05.329: W/System.err(23201):    at dalvik.system.DexPathList.findClass(DexPathList.java:315)
09-03 21:53:05.329: W/System.err(23201):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:58)
09-03 21:53:05.329: W/System.err(23201):    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
09-03 21:53:05.329: W/System.err(23201):    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
09-03 21:53:05.329: W/System.err(23201):    at pl.edu.kosttek.jadebook.agent.AgentBuyerLoader$GetJarBehaviour.getBehaviour(AgentBuyerLoader.java:227)
09-03 21:53:05.329: W/System.err(23201):    at pl.edu.kosttek.jadebook.agent.AgentBuyerLoader$GetJarBehaviour.action(AgentBuyerLoader.java:166)
09-03 21:53:05.329: W/System.err(23201):    at jade.core.behaviours.Behaviour.actionWrapper(Behaviour.java:344)
09-03 21:53:05.329: W/System.err(23201):    at jade.core.Agent$ActiveLifeCycle.execute(Agent.java:1532)
09-03 21:53:05.329: W/System.err(23201):    at jade.core.Agent.run(Agent.java:1471)
09-03 21:53:05.329: W/System.err(23201):    at java.lang.Thread.run(Thread.java:864)

我如何将我的类编译为 jar:

  1. 把 JadeAndroid.jarto libs 文件夹

  2. 使用创建 dex 并将其放入 jar 的 ant 脚本

可以排除这个 AndroidJade 类吗?

4

1 回答 1

1

我认为问题在于 Jar 中有 Jade 类,而 Classloader 中已有相同的 Jade 文件,这对 JVM 具有误导性。

也许您可以尝试编译 JAR,但不编译 Jade 类呢?所以只需包含它进行编译,但它们不会出现在 JAR 中吗?在这种情况下,您在加载类时不会出现问题,并且可以实现目标。

Upd : 如果你是用 Android 方式编译 Jar,所以我会建议链接 Jade 进行编译,但不要把它放到 libs/ 文件夹中。它将阻止它被编译到 jar 中。

祝你好运

于 2012-09-03T20:50:08.380 回答