0

我遵循以下帖子中给出的确切步骤:

是否可以在运行时从 Android 应用程序动态加载库?

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

07-27 01:24:55.692: W/System.err(14319): java.lang.ClassNotFoundException: com.shoaib.A​​ndroidCCL.MyClass 在加载器 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.

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

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();
        }
    }
}
4

1 回答 1

0

我想您的问题在于您将 MyClass 打包在 DEX 中的方式。你是怎样做的?

我按照 Shlublu 的主题尝试了自己并成功了。 我不知道如何“将 MyClass 打包到 DEX 中”,所以我只是构建了一个 android apk 并将其放入 sdcard 中。并且代码有效。

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

于 2014-02-20T01:00:27.533 回答