• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps Dynamically loading an external library at runtime

mshoaib

Lurker
I am using and android 2.2 phone for testing and getting an error which is driving me crazy :(

07-27 01:24:55.692: W/System.err(14319): java.lang.ClassNotFoundException: com.shoaib.AndroidCCL.MyClass in loader dalvik.system.DexClassLoader@43abbc20

Can someone help me what to do now..i have tried various suggested solutions on different posts

First I wrote the following class:

Code:
 package org.shoaib.androidccl;

    import android.util.Log;

    public class MyClass {
        public MyClass() {
            Log.d(MyClass.class.getName(), "MyClass: constructor called.");
        }
    
        public void doSomething() {
            Log.d(MyClass.class.getName(), "MyClass: doSomething() called.");
        }
    }

And I packaged it in a DEX file that I saved on my device's SD card as `/sdcard/testdex.jar`.

Then I wrote the program below, after having removed `MyClass` from my Eclipse project and cleaned it:

Code:
public class Main extends Activity {
    
        [MENTION=1299008]supp[/MENTION]ressWarnings("unchecked")
        [MENTION=439709]override[/MENTION]
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            try {
                final String libPath = Environment.getExternalStorageDirectory() + "/testdex.jar";
                final File tmpDir = getDir("dex", 0);

                final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
                final Class<Object> classToLoad = (Class<Object>) classloader.loadClass("org.shoaib.androidccl.MyClass");

                final Object myInstance  = classToLoad.newInstance();
                final Method doSomething = classToLoad.getMethod("doSomething");
            
                doSomething.invoke(myInstance);
            
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
Its something that i can utilize later on in my project..just wanted to test if it works or not..i assume i didnt correctly use dx to convert .class file
 
Back
Top Bottom