2016-09-02 3 views
0

In den letzten sechs Monaten als mein letztes Universitätsprojekt habe ich einen PlayStation 1 Emulator in Java geschrieben, um zu beweisen, dass er performant sein kann - ein Teil meiner Strategie beinhaltet das Schreiben eines benutzerdefinierten Klassenladers, der Bytecode importiert, den ich gerade generiert habe Array in eine neue Klasse - in der Tat ein Java-Bytecode-Dynarec-Kern, der die emulierte CPU Größenordnungen (in der Theorie) beschleunigt. Alles ist möglich auf einer Oracle JVM, und zuvor von anderen gemacht.Wie kann ich Android dynamisch erzeugten Dalvik Bytecode laden, ohne zuerst in eine Datei zu schreiben?

Meine Frage ist, abgesehen von der Tatsache, dass ich dalvik bytecode anstatt Java bytecode generieren müsste, scheint es sowieso nicht zu sein, Klassen dynamisch in eine laufende Android App zu laden, die sie nicht von einem lädt Dex-Datei auf Flash irgendwo. Ich weiß, dass ähnliche Dinge schon früher gefragt wurden, aber da ich diesen Emulator irgendwann portieren möchte (und es schneller als seine momentan unspielbare Geschwindigkeit haben), gibt es das sowieso? Ich möchte nicht ständig in Flash schreiben, wenn ein neuer Abschnitt des MIPS-Codes in Bytecode konvertiert wird, da er den Flashout tragen könnte und wahrscheinlich auch nicht sehr schnell ist.

Ein Gedanke, den ich hatte, war vielleicht ein tmpfs mit einem kleinen JNI Lib mounten und Speichern von Klassen-Dateien dort zu laden, so dass sie im RAM wie zuvor speichern - ist dies sogar möglich für eine unprivilegierte App zu tun? Ich würde den Input/Gedanken der Leute schätzen.

Antwort

1

Nein, das ist auf einem Gerät mit Jailbreak möglich, aber in einer Sandbox-App ist das nicht möglich.

Ich habe verschiedene Möglichkeiten versucht, um dynamischen Code auf Android zu laden, aber der einzig gangbare Weg ist über den DexClassLoader, wo die Dex-Datei in einer privilegierten Region gespeichert werden muss.

Sie einen Blick auf mein Projekt Byte Buddy haben kann, wo ich eine solche Klasse Laden implementiert: https://github.com/raphw/byte-buddy/blob/master/byte-buddy-android/src/main/java/net/bytebuddy/android/AndroidClassLoadingStrategy.java

+0

Danke, wirklich schade gibt es keine Möglichkeit, um dieses :-(ist Sieht aus wie wenn ich auf Android zu portieren wollen werde ich überschreiben Sie es in C++ und mit einem nativen Dynarec für ARM. – PhilPotter1987

Verwandte Themen