2012-09-03 40 views
2

我想在我的例子JadeAndroid.jar中加载使用外部库编译的Android中的类(使用dexClassLoader)。这个类(dex)在包含所有JadeAndroid类的jar中被导出(我使用ant脚本)。我的课程扩展了玉类行为。当我打开这个类我有一个例外:使用dexclassloader编译外部库的Android加载类

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使用Ant脚本和把它放入罐子里

可以排除这个AndroidJade类吗?

+0

也许这是不是解决你的问题,但要确保父类加载器你提供给DexClassLoader()来自context.getClassLoader()和*不*从ClassLoader.getSystemClassLoader() 。我愚蠢地浪费了一个小时。 – eocanha

回答

1

我认为问题在于你在Jar中有Jade类,并且在你的Classloader中已经存在相同的Jade文件,这是JVM的误导。

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

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

好运

+0

我认为这是解决方案,包括在编译玉,但从jar中排除它。但问题是如何做到这一点我没有经验与蚂蚁 –

+0

我认为你应该检查这个:http://stackoverflow.com/questions/5106749/include-jar-file-in-ant-compilation 注 - 目标是只是将Jar添加到classpath中,并将其从/ libs /文件夹中排除。但是,我希望,那个线程可以接受的答案可以提供帮助。 – AlexN