2

私の場合、JadeAndroid.jar で外部ライブラリでコンパイルされた (dexClassLoader を使用して) Android にクラスをロードしたいと考えています。このクラス (dex) は、すべての JadeAndroid クラスも含む jar にエクスポートされます (私は ant スクリプトを使用しています)。私のクラスは jade クラスの動作を拡張します。このクラスをロードすると、例外があります:

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.jar を libs フォルダに置く

  2. dexを作成してjarに入れるantスクリプトを使用する

この AndroidJade クラスを除外することは可能ですか?

4

1 に答える 1

1

問題は、Jar に Jade クラスがあり、同じ Jade ファイルが既に Classloader にあり、JVM を誤解させることだと思います。

おそらく、JAR をコンパイルしようとすることはできますが、Jade クラスをコンパイルすることはできませんか? コンパイルに含めるだけで、JARに表示されない方法で?そのような場合、クラスをロードするときに問題はなく、目標は達成されます。

Upd : Android 方式で Jar をコンパイルする場合は、Jade をリンクしてコンパイルすることをお勧めしますが、libs/ フォルダーには配置しません。jar にコンパイルされるのを防ぎます。

幸運を

于 2012-09-03T20:50:08.380 に答える