Most of what you're describing falls into the category of, "that's how class loaders work in the Java programming environment". If you create a class loader, and load a class called MyClass from it, you can't trivially refer to MyClass because the current class' loader can't resolve it. You have to use reflection to get at it. Class cast operations don't always do what you want.
You can see some twisted examples in dalvik/tests/068-classloader. The cross-loader complaints arise when you do something like this: mystuff.dex has "MyClass" and "MyOtherClass" newstuff.dex has "NewClass" and "MyOtherClass" FancyClassLoader knows about mystuff.dex and newstuff.dex FancyClassLoader uses MyOtherClass from newstuff.dex When mystuff.dex was run through "dexopt", it was verified and optimized with the assumption that references from MyClass to MyOtherClass would refer to the implementation in the same DEX file. However, FancyClassLoader chose to load a different implementation of MyOtherClass. This can cause Issues, so it's not allowed. (This could work in a more traditional VM, where the verification and optimization aren't performed ahead of time, but might not do what you expect.) If you want specifics about the classes involved, there's an intensely cryptic message in the log file ("Class resolved by unexpected DEX") that has some info. You can avoid this situation by only having one implementation of a given class. And by not loading the same DEX file into multiple class loaders. BTW, just so we don't confuse each other with terminology: (1) bootstrap class loader. Path set by BOOTCLASSPATH. Includes core / ext / framework / android.policy / services. Implemented directly by the VM. (2) system class loader, a/k/a application class loader. Path set by CLASSPATH. I don't think this is used by the Android framework. (3) user-defined class loader. The Android app framework implementation uses the ApplicationLoaders class to manage a dalvik.system.PathClassLoader per app. On Apr 16, 6:24 am, Eborix13 <ebori...@yahoo.com> wrote: > Hi, > > Seeing that the new 1.5 pre-release has support for loading classes > dynamically I immediately tried to see if it works. I used the > DexClassLoader(String dexPath, String dexOutputDir, String libPath, > ClassLoader parent) constructor. But I soon found out that it works > only partially. > > What I am trying to do is dynamically load a class from a given jar > file which contains a classes.dex file. If I try to use the current > class loader (this.getClass().getClassLoader()) as the "parent" > parameter I get a "java.lang.IllegalAccessError: cross-loader access > from pre-verified class" error. But if I use the SystemClassLoader as > the "parent" parameter everything works out nicely. But using the > SystemClassLoader is a problem for me because the class that is loaded > using the SystemClassLoader is a subclass of a class which was > previously loaded by the current class loader. Casting the derived > class to the base class generates a ClassCastException because the > base class was not loaded with the same class loader as the derived > class. > > Is there a way to solve this problem? Am I doing something wrong? Is > there a way to dynamically load a class using the current class loader > instead of the system class loader? Is this problem caused by the fact > that the 1.5 release is incomplete yet, so perhaps this problem is > going to be solved in the final release? > > Thank you... --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---