Wie kann ich eine JAR-Datei dynamisch in eine Android-Anwendung laden (4.0.3)

Ich habe eine Android-Anwendung, die dynamisch Klasse laden muss, eine undefinierte Nummer einer Jar-Klasse, die eine Schnittstelle implementiert.

Tatsächlich schaue ich mir ein Verzeichnis an und liste alle JAR-Dateien auf, die sich in diesem Verzeichnis befinden. Ich öffne das Manifest der JAR-Datei und finde die zugehörige Klasse und liste sie auf. Und danach habe ich einen dexClassLoader installiert, um alle JAR-Dateien zu laden und festzustellen, ob die Klassen, die ich im manisfest gefunden habe, meine Schnittstelle implementieren. So kann ich alle Klassen haben, die meine Schnittstelle implementiert haben, ohne sie zu Beginn zu kennen

Um fortzufahren, ich habe eine Liste der Klasse Jar, die meine Schnittstelle implementieren, aber die Liste ist von meiner Android-Anwendung und von mir unbekannt. Die Liste der Jar-Klassen kann sich jedes Mal ändern, wenn ich meine Anwendung starte.

Aber als ich versucht habe, den DexClassLoader zu erstellen, ist dies fehlgeschlagen. Ich habe immer einen Nullzeiger

DexClassLoader classLoader = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(),dexOutputDir.getAbsolutePath(), null, ClassLoader.getSystemClassLoader());

Für meinen Test habe ich den Emulator benutzt. Ich habe die JAR-Dateien mit meinem DDMS in das Verzeichnis /data/data/com.example.Myappli/JarFilesDirectory/*.jar kopiert

Beachten Sie, dass meine JAR-Datei die Dex-Datei enthält

Ich habe viel darüber gelesen. Einige Berechtigungsprobleme Ich habe alles ausprobiert, aber keine Lösung gefunden

Kann mir bitte jemand helfen !!!

Hier der Inhalt eines Manifests einer JAR-Datei

Manifest-Version: 1.0

Modulklasse: com.example.asktester.AskPeripheral

Hier mein Code:

öffentliche Klasse 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; 
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage