从Android应用程序在运行时动态加载库

时间:2013-07-26 20:36:09

标签: android dalvik

我按照以下帖子中给出的确切步骤进行了操作:

Is it possible to dynamically load a library at runtime from an Android application?

我正在使用和Android 2.2手机进行测试并得到一个让我发疯的错误:(

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

有人可以帮助我现在做什么..我已经在不同的帖子上尝试了各种建议的解决方案

我想知道这是否可行,所以我写了下面的课程:

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.");
    }
}

我把它打包成一个DEX文件,我把它保存在设备的SD卡上/sdcard/testdex.jar

然后我从Eclipse项目中删除MyClass并清除它之后编写了下面的程序:

public class Main extends Activity {

    @SuppressWarnings("unchecked")
    @Override
    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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我猜你的问题在于你在DEX中打包MyClass的方式。你是怎么做到的?

我跟随Shlublu的线程并尝试自己并成功。我不知道如何“在DEX中打包MyClass”,所以我只是构建一个android apk并将其放入SD卡。代码工作正常。

你在class.dex中包装MyClass吗? DexClassLoader只会在你的jar / dex中查找classes.dex。也许你可以先尝试我做的(构建一个签名的apk而不是jar,但你不需要安装apk),看看它是否有效希望这有帮助!