So laden Sie eine Klasse aus einem byte-array in android?
First off, die ich gesehen habe Laden von Java-Byte-Code zur Laufzeit und es war hilfreich, in so weit wie immer zu mir an der gleichen Stelle bin ich stecken momentan.
Ich versuche eine Klasse zu laden, die aus einem byte-array zu vermeiden, die Speicherung einer Datei auf der Festplatte. Für Testzwecke in diesem Beispiel, bin ich einfach Lesen .class-Datei in ein byte-array, so dass offensichtlich die Datei noch auf der Festplatte gespeichert, aber es ist nur zu sehen, wenn der code funktionieren kann.
Nehme ich dieses byte array und verwenden Sie dann eine benutzerdefinierte Klassenlader mit der Methode loadClass eine Klasse zu laden, aber es funktioniert nicht.
byte[] bytearray = null;
try{
RandomAccessFile f = new RandomAccessFile("/sdcard/ClassToGet.dex", "r");
bytearray = new byte[(int) f.length()];
f.read(bytearray);
MyClassLoader classloader = new MyClassLoader();
classloader.setBuffer(bytearray);
classloader.loadClass("com.pack.ClassIWant");
}
Hier ist die ClassLoader-Implementierung:
public class MyClassLoader extends DexClassLoader {
private byte[] buffer;
@Override
public Class findClass(String className){
byte[] b = getBuffer();
return this.defineClass(className, b, 0, b.length);
}
public void setBuffer(byte[] b){
buffer = b;
}
public byte[] getBuffer(){
return buffer;
}
Und die Fehler ich erhalte, ist dies:
java.lang.UnsupportedOperationException: kann nicht geladen werden dieser Art von class-Datei
bei java.lang.VMClassLoader.defineClass(Native-Methode)
Habe ich versorgte Sie mit .class-Dateien .dex-Dateien .apk, .jar, etc... ich habe keine Ahnung, was für eine "Art von class-Datei", es will von mir und die Dokumentation nicht vorhanden ist. Jede Hilfe wäre toll, ich habe versucht, diese Arbeit für vier Tage gerade.
- stackoverflow.com/a/3024261/61855
- Ich bin noch immer die gleiche Fehlermeldung "UnsupportedOperationException" auch über die dex-Dateien / jar-Dateien. Was hast du am Ende machst aus deinem Beispiel?
- Wer seid Ihr anderen? Mich? Wenn Sie den Bezug zu meiner Frage, auf die Sie verlinkt: ich war nicht mit Android für dieses Projekt, so dass keine Probleme gibt.
- Android-26 hat InMemoryDexClassLoader developer.android.com/reference/dalvik/system/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellen Sie sicher, dass Ihre
.dex
Datei ist ein echter dx-produziert Dalvik ausführbaren Datei und kein Java -.class
Datei in der Verkleidung. Wenn Sie die.dex
Erweiterung der Datei muss ein.dex
- Datei; andernfalls verwenden Sie ein.jar
- Erweiterung für ZIP-Datei enthält eineclasses.dex
Eintrag.Nicht alle Versionen von Dalvik geladen werden können Klassen aus dem Speicher. Sie können dies umgehen, indem Sie laden die Klasse aus dem Datei-system. Es gibt ein Beispiel in DexMaker ist
generateAndLoad
Methode:Ich habe das gleiche problem, das Sie haben.
Der Grund, warum erhalte ich die Fehlermeldung "kann nicht geladen werden dieser Art von class-Datei" ist einfach.
In der Plattform Quelle, "/dalvik/vm/native/java_lang_VMClassLoader.cpp" das ist die Methode defineClass" gibt immer Ausnahme, wie folgt. (version: ICS)
Dann Griff ich zu dem Schluss, dass ich nicht laden kann .dex in byte-array-format.
Gibt es jemand, der geladen werden kann .dex durch die Verwendung von byte-array? (keine Dateien)
Android nicht laufen JVM-bytecode, sondern Dalvik bytecode. Damit Ihr Unternehmen sollte beinhalten diese Zeile vor
defineClass()