2012-04-14 11 views
0

Ich bin nur in Android Entwicklung begonnen, und verwenden Sie Netbeans mit NBAndroid und SDK 17.Sharing-Java-Bibliothek mit Android Apps

Ich möchte die gleiche Java-Quellcode in meinem Java und Android App verwenden.

http://developer.android.com/guide/developing/projects/projects-eclipse.html sagt, wie es in Eclipse zu tun ist (obwohl es auf der JAR-Verbindungssache skizzenhaft ist), aber ich kann nicht scheinen, es in NB zu arbeiten.

Basierend auf diesem Link, ist das korrekte Setup für die Android-App ein Android-Anwendungsprojekt, das auf ein Android-Bibliotheksprojekt verweist, das wiederum auf eine von einem Java Library-Projekt erstellte JAR-Bibliothek verweist. Ich könnte dann auch ein Java-Anwendungsprojekt haben, das auf dasselbe Java-Bibliotheksprojekt verweist.

Also, ich habe diese Projektstruktur eingerichtet ... Ich habe ein AndroidApp-Projekt, das eine grundlegende HelloAndroid-Aktivität in einem com.ex-Paket ist. Dieses Projekt enthält ein AndroidLib-Bibliotheksprojekt im Ordner Bibliotheken. Ich habe auch eine LibClass.java-Datei, die eine einfache LibClass-Klasse definiert, die eine Funktion getText() hat, die nur einen anzuzeigenden String zurückgibt. Die MainActivity in der AndroidApp ruft dies auf, um die Ausgabe der Zeichenfolge zu erhalten.

Wenn ich LibClass.java direkt in das AndroidLib-Projekt einfüge, ist alles in Ordnung.

Aber was ich tun möchte ist, den Quellcode mit Java zu teilen.

Ich möchte also die LibClass.java in die JavaLib-Bibliothek verschieben, deren .JAR-Datei im AndroidLib-Projekt enthalten ist. Als ich das versuchte, erhalte ich einen Fehler in der MainActivity-Klasse und beschwere mich, dass ich LibClass nicht finden kann. Im Projektfenster kann ich LibClass.class im com.ex-Paket in der JavaLib.jar im Bibliotheksordner des AndroidLib-Projekts sehen. Und AndroidLib ist im Ordner Libraries des AndroidApp-Projekts sichtbar, zeigt dort jedoch keine Pakete oder andere Inhalte an.

So fühle ich mich wie ich bin nur einen Schritt davon entfernt, diese Arbeit zu machen. Muss ich etwas mit der einen oder anderen AndroidManifest-Datei machen? Oder etwas mit den build.xml Dateien machen? Oder bin ich überhaupt auf der falschen Spur?

Ich wäre wirklich dankbar, wenn jemand ein How-To dafür schreiben könnte.

Antwort

0

Wenn ich Ihre Situation richtig verstehe, versuchen Sie, eine benutzerdefinierte Java-Bibliothek für Ihre Android- und Java-Anwendungen zu verwenden.

Für dieses Szenario können Sie zuerst die Java-Bibliothek erstellen. Anstatt das Java-Bibliotheks-JAR als Android-Bibliothek hinzuzufügen, können Sie das JAR direkt in den libs-Ordner des Android-Projekts legen und es dem Build-Pfad des Android-Projekts hinzufügen.

Wenn Sie ANT-Skripts zum Erstellen der Java-Bibliothek jar verwenden, können Sie die Quelldateien auch als Teil von jar hinzufügen. Dies wird Ihnen helfen, Code-Unterstützung zu erhalten, wenn Sie den Android-Teil entwickeln. Aber dieser Teil ist rein optional.

+0

Ich weiß nichts über ANT-Skripte, aber verstehe, dass sie irgendwo hinter Netbeans sind. Wenn ich die JAR-Bibliothek direkt in das Android-Projekt lege, kompiliert sie OK, wird aber nicht ausgeführt. Ich vermute, das liegt daran, dass das JAR in gewisser Weise von der JDK-Plattform und nicht von der Android-Plattform abhängt. Es scheint keine Möglichkeit zu geben, die Android-Plattform zu einem Projekt hinzuzufügen, außer es als Android-Projekt zu erstellen. – user998303

0

Das Problem ist, dass die Java-Plattform in Android unterscheidet sich von der JDK-Plattform.

Insbesondere kann sich die .JAR-Bibliothek NICHT auf etwas beziehen, das nicht in der Android-Plattform enthalten ist. Ein Beispiel für Dinge, auf die Sie nicht verweisen können, ist java.awt. * (Außer Sie können java.awt.fonts haben).

Es gibt auch einen Unterschied zwischen JDK String und Android String - Android implementiert die isEmpty() Methode nicht.

+0

Dieser String "Problem" hapst, weil Sie eine alte Version von Android zielen, die Methode 'isEmpty()' wurde in Android Api 9, Gingerbread und auf JDK 6 eingeführt. Wenn Sie diese alten Versionen zielen, denken Sie, dass Sie jdk 5 verwenden – brunodles

0

Ich versuche etwas ähnliches; Ich habe Java EE-Projekte, die mit Eclipse erstellt wurden, und ich versuche, einen Teil dieses Codes aus meinen Android-Projekten zu nutzen. Dies sollte mir eine gemeinsame Codebasis geben, anstatt einer Reihe von verwirrenden SVN Externals, die ich zuvor ertragen musste.

Anstatt JAR-Dateien zu erstellen, habe ich festgestellt, dass die Arbeit mit der Quelle und dem Aufbau für die Plattform am besten funktioniert (nun, es hat funktioniert, aber ich habe ein Problem damit). Also, was ich tue ist:

c:\MySvnFolderStructure\MyJavaProjectFolder\src\  (and then all the source under that) 
c:\MySvnFolderStructure\MyJavaProjectFolder\android\ (and all the Eclipse Android project gubbins) 
c:\MySvnFolderStructure\MyJavaProjectFolder\jee\  (and all the Eclipse JEE project gubbins) 

Die Android und Java EE-Projekte keine eigene src Ordner haben, sie beide Link zu den src-Ordner in ihrem übergeordneten Ordner. Das bedeutet, dass jede der Java-Implementierungen ihre eigene Byte-Code-Version aus der Quelle erstellt und ihre eigenen externen Bibliotheken (wie beispielsweise die Apache HTTP-Bibliotheken) verwendet.

Natürlich können sie Sachen wie awt nicht teilen (wie in einem anderen Beitrag erwähnt), aber es gibt viele Sachen, die cross-over tun, besonders wenn es Core-Java-Klassen sind, die verwendet werden.

Außerdem ist es ein bisschen schwierig, JUnit-Tests zu schreiben, da es im Moment eine Verdopplung des Testcodes geben muss, da die Android-Geräte zusätzliche Instrumentierung benötigen, aber ich arbeite daran.

Siehe auch this post about relative paths in Eclipse, was bedeutet, dass die Ordner an verschiedenen Stellen auf verschiedenen Rechnern ausgecheckt werden können (wie wir alle mit unseren Versionskontroll-Checkouts) und trotzdem geteilt werden.

+0

Ja, das wollte ich machen. Ich habe die Art und Weise, wie Java JARs verlinkt/lädt, falsch verstanden. Ohne besonderen Grund hatte ich die Idee, dass Java wie C. Ungelöste Referenzen gelinkt/geladen wurden, um die Ausführung nicht zu verhindern, solange sie nicht dereferenziert wurden. Also könnte ich awt. * Importieren, aber solange ich awt nicht benutzt habe. * Objekte in der Android-Version wären alle in Ordnung. Diese Annahme erweist sich als sehr falsch. Danke für deine nützliche Antwort. – user998303