DexClassLoder - не нашел класс по пути
Я пытаюсь загрузить классы из внешнего файла JAR, помещенного на SDCard. Многие люди успешно использовали DexClassLoader.
Мои шаги:
1) Создайте файл classes.dex из файла jar:
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) Когда я вижу, что внутри декс:
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, но он пуст.
Пожалуйста помоги!!!
1 ответ
Единственный способ загрузить классы из 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? Спасибо!
Кажется, вы установили неправильный порядок
ClassLoader classLoader = new DexClassLoader(context.getDir("dex",
Context.MODE_PRIVATE).getAbsolutePath(), jarfile.getAbsolutePath(), null,
context.getClassLoader());
заменить первый параметр вторым
Дополнительная информация https://developer.android.com/reference/dalvik/system/DexClassLoader