2

SDカードに配置された外部JARファイルからクラスをロードしようとしています。多くの人がDexClassLoaderをうまく使いました。

私の手順:

1) jar ファイルからclasses.dexファイルを作成します。

dx --dex --output=classes.dex file.jar

2) 生成された classes.dex ファイルを jar に追加します

3) DexClassLoader を作成します。

ClassLoader classLoader = new DexClassLoader(context.getDir("dex",
    Context.MODE_PRIVATE).getAbsolutePath(), jarfile.getAbsolutePath(), null,
    context.getClassLoader());

4) 内部の dex にあるものを見ると、次のようになります。

try {
  DexFile dx = DexFile.loadDex(jarFile.getAbsolutePath(), File.createTempFile("opt", "dex",
    context.getCacheDir()).getPath(), 0);
  // Print all classes in the DexFile
  for(Enumeration<String> classNames = dx.entries(); classNames.hasMoreElements();) {
    String className = classNames.nextElement();
    System.out.println("class: " + className);
  }
} catch (IOException e) {
    e.printStackTrace();
}

DexOpt: --- BEGIN 'file.jar' (bootstrap=0) ---
DexOpt: --- END 'file.jar' (success) ---
DEX prep '/mnt/sdcard/tmp/file.jar': unzip in 0ms, rewrite 83ms
class: com.test.TestClass

5) 負荷クラス:

Class<?> class = classLoader.loadClass("com.test.TestClass");

ここで例外が発生します!:

java.lang.ClassNotFoundException: Didn't find class "com.test.TestClass" on path: /data/data/com.myapp/cache/app_dex

app_dex ディレクトリが作成されますが、空です。

助けてください!!!

4

2 に答える 2

2

jar からクラスをロードできる唯一の方法は、DexFileクラスによるものです。

DexFile dexFile = DexFile.loadDex(jar.getAbsolutePath(),
    File.createTempFile("opt", "dex", context.getCacheDir()).getPath(), 0);
....
Class<?> currClass = dexFile.loadClass(className, context.getClassLoader());

DexClassLoaderでこれを行うことができない理由は非常に興味深いです。Android 4.2.2 または 4.4.2 で使用している人はいますか? ありがとう!

于 2014-12-11T12:21:53.477 に答える