インターフェイスを実装した未定義の数のjarクラスを動的にロードする必要があるAndroidアプリケーションがあります。
実際、ディレクトリを見て、このディレクトリにあるすべての jar ファイルをリストします。jar ファイルのマニフェストを開き、関連するクラスを見つけてリストします。その後、dexClassLoader をインスタンス化して、すべての jar ファイルをロードし、マニフェストで見つけたクラスがインターフェイスを実装しているかどうかを確認しました。このように、最初にそれらを知らなくても、インターフェースを実装したすべてのクラスを持つことができます
再開するには、インターフェイスを実装するクラス jar のリストがありますが、リストは Android アプリケーションと私には不明です。jar クラスのリストは、アプリケーションを起動するたびに変更できます。
しかし、DexClassLoader を作成しようとすると失敗します。私は常にヌルポインタを持っています
DexClassLoader classLoader = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(),dexOutputDir.getAbsolutePath(), null, ClassLoader.getSystemClassLoader());
テストを行うために、エミュレータを使用しました。DDMS で jar ファイルをディレクトリ /data/data/com.example.Myappli/JarFilesDirectory/*.jar にコピーしました
私の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;
}