2014-12-01 4 views
1

Я пытаюсь загрузить классы из внешнего JAR-файла, размещенного на SD-карте. Многие люди использовали DexClassLoader successfuly.DexClassLoder - не нашел класс по пути

Мои шаги:

1) Создание 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 каталог, но он пуст.

Пожалуйста, помогите !!!

ответ

2

Единственный способ, которым я мог загружать классы из кувшина является 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? Спасибо!