У меня есть приложение для Android, которое должно загружать динамически класс, undefined номер класса jar, который реализовал интерфейс.
Фактически, я смотрю на каталог и перечисляю все файлы jar, которые находятся в этом каталоге Я открываю манифест файла jar и нахожу соответствующий класс и перечисляю его. И после этого я установил dexClassLoader для загрузки всех файлов jar и выяснения того, что классы, которые я нашел в manessest, реализуют мой интерфейс. Как и я, я могу иметь весь класс, который реализовал мой интерфейс, не зная их при запуске
Чтобы возобновить работу, у меня есть список классов jar, которые реализуют мой интерфейс, но список неизвестен моим приложением android и мной. Список классов jar может меняться каждый раз, когда я запускаю свое приложение.
Но когда я попытался создать DexClassLoader, он потерпел неудачу. У меня всегда есть нулевой указатель
DexClassLoader classLoader = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(),dexOutputDir.getAbsolutePath(), null, ClassLoader.getSystemClassLoader());
Чтобы выполнить мой тест, я использовал эмулятор. Я скопировал с моим DDMS файлы jar в каталог /data/data/com.example.Myappli/JarFilesDirectory/*. баночка
Обратите внимание, что мой файл jar содержит файл dex
Я много читал об этом. Некоторые проблемы с разрешениями Я пробовал все, но не нашел решение
Может кто-нибудь мне помочь!
здесь содержимое манифестного файла jar
Манифест-версия: 1.0
Модуль-класс: com.example.asktester.AskPeripheral
Здесь мой код:
открытый класс ModuleLoader {
private static List<URL> urls = new ArrayList<URL>();
private static List<String> getModuleClasses(String folder)
{
List<String> classes = new ArrayList<String>();
//we are listing the jar files
File[] files = new File(folder).listFiles(new ModuleFilter());
for(File f : files)
{
JarFile jarFile = null;
try
{
//we open the jar file
jarFile = new JarFile(f);
//we recover the manifest
Manifest manifest = jarFile.getManifest();
//we recover the class
String moduleClassName = manifest.getMainAttributes().getValue("Module-Class");
classes.add(moduleClassName);
urls.add(f.toURI().toURL());
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if(jarFile != null)
{
try
{
jarFile.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
return classes;
}
private static class ModuleFilter implements FileFilter {
@Override
public boolean accept(File file) {
return file.isFile() && file.getName().toLowerCase().endsWith(".jar");
}
}
private static ClassLoader classLoader;
public static List<IPeripheral> loadModules(String folder, Context CurrentContext) throws IOException, ClassNotFoundException
{
List<IPeripheral> modules = new ArrayList<IPeripheral>();
List<String> classes = getModuleClasses(folder);
final File dexInternalStoragePath = new File(CurrentContext.getDir("dex", Context.MODE_PRIVATE),"ask.dex");
File dexOutputDir = CurrentContext.getDir("dex", Context.MODE_PRIVATE);
final File dexClasses = new File(CurrentContext.getDir("dex", Context.MODE_PRIVATE),"ASK.jar");
DexFile dexFile = DexFile.loadDex(dexClasses.getAbsolutePath(), dexOutputDir.getAbsolutePath(), 0);
DexClassLoader classLoader = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(),dexOutputDir.getAbsolutePath(), null, ClassLoader.getSystemClassLoader());
//Class<?> myClass = classLoader.loadClass("com.example.asktester.AskPeripheral");
if(IPeripheral.class.isAssignableFrom(myClass )){
Class<IPeripheral> castedClass = (Class<IPeripheral>)myClass ;
IPeripheral module = castedClass.newInstance();
modules.add(module);
}
}
catch (ClassNotFoundException e1)
{
e1.printStackTrace();
}
catch (InstantiationException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
return modules;
}