# Lib für (Desktop-)Java und Android schreiben



## daybyter (10. Apr 2014)

Hallo!

Ich hab eine Java Lib geschrieben, die ich in Desktop und Server Anwendungen benutze.

Diese möchte ich nun auch unter Android benutzen.

Problem: die Lib lädt Treiber aus Jarfiles nach, was unter Android so nicht funktioniert. Also füge ich momentan diese Treiber direkt zum Buildpath hinzu, checke den Classpath und instantiiere die Objekte dann, wenn ich im Classpath eine passende Klasse finde. Dieses ist nicht so schön und ausserdem brauch ich nun Klassen wie DexFile oder PathClassLoader, die es unter Java ja nicht gibt. Also muss ich das Android.jar für meinen API Level zum Java-Projekt hinzufügen. 

Keine schöne Lösung...

Alternativ könnte man z.B. noch bedingte Compilierung benutzen, aber dann wäre zumindest das Compilat ja wiederum nur auf dem Zielsystem lauffähig.

Hat jemand von euch schonmal sowas in der Art entwickelt? Wie habt ihr die Android Abhängigkeiten gehandhabt?

Vielen Dank im Voraus für jeden Antwort,
Andreas


----------



## dzim (16. Apr 2014)

Vielleicht verstehe ich nur nicht dein konkretes Problem (da hier anscheinend JNI-Calls auf andere(?) libs gemacht werden).
Ich verwende in meiner App Jackson zum parsen von JSON und SimpleXML zum parsen von - guess what!? - XML... Beide liegen einfach nur im dafür vorgesehenen lib-Ordner. Die libs haben keine spezielle Anpassung (sind also keine Android-Library-Projekte), um zu funktionieren. Kannst du das Problem noch einmal etwas genauer spezifizieren???


----------



## daybyter (16. Apr 2014)

Erstmal vielen Dank für Deine Antwort!

Meine Desktop Version lädt zur Laufzeit Klassen aus jar Files nach, um bestimmte Webseiten anzusprechen. Quasi so eine Art 'Treiber' für die jeweilige Website. Das klappt aber unter Android nicht, weil ja der Java Bytecode zu Dalvik compiliert wird, was ja aber das Smartphone nicht kann, sondern nur der PC, auf dem entwickelt wird. Also müsste ich quasi alle 'Treiber' auf dem Desktop PC compilieren und dann auf dem Smartphone per speziellem Code nachladen. Das gibt aber wiederum in der Desktop Version Probleme, weil ja 'normales' java keine DexFile Klasse usw. kennt. Diesen Code könnte ich mit nem normalen JDK nicht compilieren.

Ich weiss...ziemlich spezielles Problem...

Ich hab mir aktuell mit einem Hack beholfen, der Klassen auf dem Handy aus dem Classpath nachladen kann. So muss ich halt alle Jars fest in den Buildpath einbinden...nicht sehr schön...


----------



## dzim (17. Apr 2014)

Ok, ich versteh das Problem wohl immer noch nicht ganz, denn: Wenn du eine reguläre Bibliothek (also ideal ein in Java6 kompiliertes .jar-File, für alles unter API-Level 19; ab 19 kannst du IMHO Java7 nutzen) in dein libs-Verzeichnis wirfst, wird der Build-Prozess von Android dieses .jar auspacken und - wie er es auch für deine Klassen tut - die .class-Files in das dex-Format umwandeln. Wichtig ist einfach die Kompatibilität der Bibliotheken und dass sie halt keine Features aus den neueren Java-Versionen nutzen können.


----------



## daybyter (17. Apr 2014)

Ist schon klar...

Aber ich hab ja _viele_ jar Files. Und ein Jar File lädt zur Laufzeit die anderen nach. Je nachdem, welche Funktionen gerade gebraucht werden. Und das klappt halt nicht.


----------



## dzim (19. Apr 2014)

Verstehe, aber da musst du dir jetzt diese Frage gefallen lassen: Wieso?
Also im normalen Java Umfeld ist das sicher noch in Ordnung, aber Android ist nun mal ein embedded-System. Resourcen sollten (auch wenn es bei den aktuellen Geräten echt schräg klingt) geschont werden. Und das nachladen könnte teuer werden denke ich. Lieber alle Libs drin und die notwendigen Klassen können dann schnell angesprochen werden.

Ich weiss nicht, ob man libs einfach nur für sich dexen kann... Wenn ja, dann wäre es sicher möglich, sie inm assets-Verzeichnis zu hinterlegen und dann irgendenwie zu laden, aber das sind sachen, die ich noch nie verwenden musste. Lieber würde ich mir OSGi im Android-Umfeld antun als zu versuchen, deinen Ansatz aus der Java-Welt aufrecht zu erhalten.


----------



## daybyter (19. Apr 2014)

Na die Lib entwickelt sich ständig weiter und ich will nur einen Source-Zweig pflegen müssen.


----------



## Tobse (20. Apr 2014)

Also wenn die Libs doof genug sind, um die Sachen nachzuladen anstadt sie in den Classpath zu tun (was ja bei den aktuellen PCs praktisch keinen Unterschied macht was RAM-Verbrauch und Performance angeht), wirst du auch nicht drum rum kommen das wieder zu berichtigen.
Je nachdem mit welcher IDE du arbeitest kannst du in den Build-Process nen eigenen Code einbauen, der die .java Dateien zu .class compiliert, in dein assets oder lib Verzeichnis kopiert und schließlich zum Classpath hinzufügt (wobei das mit dem Classpath je nach IDE auch schwieriger werden kann wenn bei den Libraries Klassen dazukommen/verschwinden).


----------

