使用dexclassloader使用外部库编译的Android加载类

时间:2012-09-03 20:38:46

标签: android classloader

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

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. 使用ant脚本创建dex并将其放入jar

  3. 可以排除这个AndroidJade类吗?

1 个答案:

答案 0 :(得分:1)

我认为问题在于你在Jar中有Jade类,并且你的类加载器中已有相同的Jade文件,这会误导JVM。

也许你可以尝试编译JAR,但不能编译Jade类吗?所以只需将其包含在编译中,但是它们不会出现在JAR中? 在这种情况下,您在加载课程时将没有任何问题,并且将实现目标。

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

祝你好运