Frage

Ich versuche, eine Anwendung zu codieren, die un verschiedene Java-Plattformen wie J2SE läuft, J2ME, Android, etc. Ich weiß schon, dass ich für jede Plattform der meisten der Benutzeroberfläche neu zu schreiben würde, will aber den Kern wieder zu verwenden Logik.

Mit diesem Kern tragbaren Keeping umfasst drei Nachteile, die ich kenne:

  1. Die Einhaltung der alten Java 1.4 Syntax , keine der schönen Sprachfunktionen von Java unter Verwendung von 5,0
  2. nur mit externen Bibliotheken , die auf diesen Plattformen arbeiten, sind bekannt (das heißt: Sie JNI nicht verwenden und keine Abhängigkeiten zu anderen Bibliotheken, die diese Regeln verletzen)
  3. nur die Klassen, die vorhanden sind auf all diesen Plattformen

Ich kenne Wege zu überwinden (1) : Code in 5.0 Stil und es automatisch auf 1,4 zu konvertieren ( Retroweaver - habe es noch nicht ausprobiert, aber scheint ok ).

Ich denke (2) ist ein Problem, das ich habe nur zu akzeptieren.

Nun würde Ich mag wissen, was die beste workarround für (3) , insbesondere Collection-Klassen, die ich am meisten vermissen. Ich kann denken, von denen:

  • Die meisten Programmierer ich einfach nicht wissen, verwenden Set, Map, List usw. und Rückfall auf Vector und schlicht Arrays. Ich denke, dass dieser Code hässlich in erster Linie macht. Aber ich weiß auch, dass die richtige Wahl zwischen TreeSet/Hashset oder LinkedList/ArrayList für die Leistung entscheidend ist, und immer mit Vector und Arrays kann nicht richtig sein.
  • Ich konnte meine eigenen Implementierungen, die Klassen codiert. Dies scheint das Rad neu erfinden zu werden, und ich denke, dass ich nicht tun könnte es so gut wie andere getan haben.
  • Da Java Open Source ist, dass ich den Sourcecode des J2SE Sammlungen Rahmen greifen könnte und sind in meine Anwendung, wenn für J2ME Aufbau. Ich weiß nicht, ob dies eine gute Idee ist, wenn. Pherhaps gibt es gute Gründe, dies nicht zu tun.
  • Vielleicht gibt es schon Bibliotheken gibt, die die wichtigsten Merkmale der Sammlungen Rahmen wieder aufzubauen, sind aber für Low-End-Systeme optimiert, pherhaps durch nicht-Funktionalität implementieren, die selten verwendet wird. Wissen Sie überhaupt?

Vielen Dank für Ihre Antworten und Meinungen!

Edit: Ich fand schließlich eine (komplexe, aber schön) Lösung, und ich dachte, durch meine eigene Antwort zu geben und zu akzeptieren sie würde die Lösung an der Spitze sichtbar werden. Aber im Gegenteil, meine Antwort ist immer noch am unteren Ende.

War es hilfreich?

Lösung 2

Es ist schon eine Weile her, seit ich diese Frage gestellt, und ich Weile her, seit ich eine schöne, funktionierende Lösung für das Problem gefunden, aber ich hatte da forgotton zu sagen.

Mein Schwerpunkt war die Java Collections Framework, die einen Teil des java.util Paket ist.

Ich habe endlich den Quellcode Sonnen Java 6.0 und kopiert alle Klassen genommen, die in ein Projekt meiner eigenen Sammlungs Rahmen gehören. Dies war ein Java 6.0-Projekt, aber ich habe die Gläser von J2ME als Classpath. Die meisten dieser Klassen, die ich hängen von anderen J2SE Klassen kopiert, so dass es gebrochen Abhängigkeiten. Wie auch immer, es war ziemlich einfach, diese depensencies zu schneiden, indem sie alles auszulassen, die mit Serialisierung beschäftigt (was für mich keine Priorität) und einige kleinere Anpassungen.

ich das Ganze mit einem Java-6-Compiler kompiliert und Retrotranslator zu Port 1.2 die resultierende Bytecode zurück zu Java verwendet wurde.

Als nächstes Problem ist der Paketname, weil Sie keine Klassen von java.util mit einer J2ME-Anwendung liefern können und laden sie - der Bootstrap Class Loader nicht in die Anwendungen JAR-Datei aussehen wird, werden die anderen Bootloader nicht geladen werden darf etwas mit diesem Paketnamen, und auf J2ME können Sie keine benutzerdefinierten Klassenladeprogramme definieren. Retrotranslator wandelt nicht nur Bytecode, hilft es auch Namensverweise in bestehenden Bytecode zu ändern. Ich musste alle Klassen in meinem Projekt verschieben und umbenennen, z.B. java.util.TreeMap wurde my.company.backport.java.util.TreeMap_.

Ich war als in der Lage tatsächliche J2ME-Anwendung in einem zweiten Java 6.0-Projekt zu schreiben, die den üblichen java.util.TreeMap verwiesen, die generische Syntax typsichere Sammlungen zu erstellen, kompiliert, die App zu Java 6.0-Byte-Code, und führen Sie es durch Retrotranslator zu Java 1.2-Code erstellen, die jetzt my.company.backport.java.util.TreeMap_ verweist. Beachten Sie, dass TreeMap ist nur ein Beispiel, es funktioniert tatsächlich für den ganzen Sammlungen Rahmen und auch für 3rd-Party-J2SE-Gläser, die diesen Rahmen verweisen.

Die resultierende App kann als Glas und JAD-Datei verpackt werden und läuft auf beiden J2ME-Emulatoren und tatsächlichen Geräte (getestet auf einem Sony Ericsson W880i) in Ordnung.

Der gesamte Prozess sehr komplex scheint, aber da ich verwenden Ant für Build-Automatisierung, und ich brauchte retranslator wie auch immer, es gab nur einen einmaligen Aufwand des Sammlung Rahmen Backport einrichten.

Wie bereits erwähnt, ich habe das vor fast einem Jahr getan, und schreibe dies vor allem aus der Spitze von meinem Kopf, so dass ich hoffe, es gibt keine Fehler drin. Wenn Sie an weiteren Details interessiert sind, lassen Sie mir einen Kommentar. Ich habe ein paar Seiten der deutschen Dokumentation bekommt zu diesem Vorgang, die ich zur Verfügung stellen könnte, wenn es eine Nachfrage besteht.

Andere Tipps

J2ME ist brutal, und du wirst nur sich selbst zurücktreten müssen, ohne einige der Feinheiten von anderen Plattformen zu tun. Lassen Sie sich bei Hashtable und Vector verwendet, und schreiben Sie Ihre eigenen Wrapper auf dieser. Außerdem machen Sie nicht den Fehler anzunehmen, dass J2ME Standard entweder ist, wie jeder Hersteller JVM Dinge tun kann, in völlig unterschiedlicher Art und Weise. Ich würde zunächst nicht viel über die Leistung kümmern, da nur Korrektheit auf J2ME immer genug eine Herausforderung ist. Es ist möglich, eine App zu schreiben, die über J2ME, J2SE und Android läuft, wie ich es getan habe, aber es braucht eine Menge Arbeit. Ein Vorschlag, dass ich möchte, ist, dass Sie den Kern Ihrer Anwendungslogik schreiben und halten sie sich streng an java.lang, java.util und java.io. Überall, wo Sie gehen, etwas zu tun, die mit der Plattform interagieren könnte, wie das Dateisystem oder Netzwerk können Sie eine Schnittstelle, die Ihr Kernanwendungscode interagiert mit erstellen, dass Sie verschiedene Implementierungen für die verschiedenen Umgebungen haben. Zum Beispiel können Sie eine Schnittstelle, die HTTP-Sachen einpackt und verwendet javax.microedition.io.HttpConnection mit J2ME und java.net.HttpURLConnection auf Android. Es ist ein Schmerz, aber wenn Sie eine App läuft auf allen drei dieser Umgebungen halten wollen, kann es Sie dort ankommen. Viel Glück.

Wir standen vor genau diese Situation bei der Entwicklung von ZXing . Wenn J2ME in der Liste der Ziele ist, ist dies Ihr limitierender Faktor bei weitem. Wir gezielte MIDP 2.0 / CLDC 1.1. Wenn Sie eine ähnliche Anforderung haben, müssen Sie Java 1.2 bleiben. Java 1.4 Sprachfeatures sind auf jeden Fall nicht vorhanden ist (wie assert) und in der Regel werden Sie nichts nach 1.2 in J2ME finden.

Wir haben Sie keine externen Bibliotheken, aber Sie sie in Ihr Einsatz .jar-Datei mit wenig Mühe verpacken konnte. Es würde die resultierende .jar größer machen, und das könnte ein Problem sein. (Dann können Sie versuchen Optimizern / shrinkers wie ProGuard dass zu mildern.)

Ich habe am Ende so etwas wie Collections.sort Neuimplementierung () und Vergleicher, da wir sie brauchten, und sie sind nicht in J2ME. Also ja Sie könnten tun dies in Fällen betrachten, wenn auch nur bei Bedarf.

Wir verwenden Vector und Hashtable und Arrays, da es keine andere Wahl, wirklich, in J2ME. Ich würde sie nur verwenden, wenn Sie einen Grund haben nicht zu, und das wäre die Leistung, denke ich. JVM Entscheidungsträger in der Theorie bereits deren Umsetzung zu optimieren, aber das bedeutet nicht, dass Sie nicht ein besseres machen könnte ... Ich glaube, ich wäre überrascht, wenn es sich lohnt, in der überwiegenden Mehrheit der Fälle. So stellen Sie sicher, dass Sie das wirklich tun müssen, bevor in der Bemühung setzen.

Um eine weitere Sammlungen Bibliothek Teil Ihrer Frage zu beantworten wäre Javolution die für J2ME gebaut werden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top