2017-02-03 5 views
9

Ich habe Probleme, mein externes Java-Projekt zu bekommen, damit ich auch Android-Klassen verwenden kann. Die Bibliothek ist bereits in das Android-Projekt integriert. Zum Beispiel: Ich habe mehrere Modellklassen, die ich implementieren möchte Parcelable, so dass sie entsprechend serialisiert werden können, aber keine der Android-Klassen sind auf ihnen verfügbar.Integration einer externen Java-Bibliothek und Zugriff auf Android-Klassen

Klärung Ich tat dies nur zu lösen, um zu versuchen, das Problem

Bisher habe ich nur versucht habe:

  • ändern und dazu passende Paktes der externen Bibliothek:

Paketname in Android

com.domain.androidproject

Library Paket ursprünglich

com.domain.libproject

geändert:

com.dommain.androidproject.libproject

aber kein Glück so weit. Ich importierte die Bibliothek als ein externes Projekt Gradle vía:

compile project(path: ':LibProject') 

Vielen Dank für Ihre Hilfe.

+3

Unklare auf die Frage ... warum sollten Sie Paketnamen überhaupt ändern müssen? Dies ist eine externe Abhängigkeit, warum können Sie sie nicht einfach importieren und verwenden? –

+0

Weil ich es ursprünglich so gemacht habe, aber nicht funktioniert – Chisko

+0

Was meinst du, es hat nicht funktioniert? Was ist passiert, als du es versucht hast? Was Christopher vorgeschlagen hat, ist der richtige Weg, und wenn Sie ein Problem damit haben, sollten Sie dieses Problem lösen (das Problem im Kern lösen), anstatt eine Menge Bridges und Wrapper zu erstellen. –

Antwort

-2

Im Allgemeinen wenn Sie wollen Verwendung von Klassen in einer anderen Projekt/Bibliothek machen:

Datei -> Neu -> Import-Modul -> Wechseln Sie in das Verzeichnis eines altes Projekt/Library -> Ok

Markieren Sie die Module, die Sie importieren möchten -> OK

Klicken Sie mit der rechten Maustaste auf das App-Modul -> Moduleinstellungen öffnen -> Abhängigkeiten -> + -> Modul -> Das neue Modul.

Ihr Projekt sollte dann in jedem Projekt verwendet werden können, für das Sie es gerade getan haben.

+0

Bitte lassen Sie mich wissen, wenn ich mich nicht richtig auf die Frage erkläre. Ich möchte Android-Klassen in diesem Projekt verwenden und nicht umgekehrt. – Chisko

+1

Die Entwicklungskits werden das wahrscheinlich verhindern. Wenn Java um jdk herum gebaut wird, wird Android um den Android-SDK herum gebaut, der eine jdk enthält. So können Sie Java in einem Android-Projekt implementieren, aber nicht Android-spezifischen Code in einer Java-Bibliothek, ohne Ihre Umgebung so zu konfigurieren, dass sie auch Android verwendet. Aus Neugier, warum willst du das machen? – KoalaKoalified

+0

Wie ich schon sagte, ich möchte Modellklassen aus diesem Projekt in der Lage sein, 'Parcelable' zu ​​verwenden. Das Projekt wurde bereits importiert und befindet sich in einem eigenen Verzeichnis, aber ich kann keine Klassen von Android darin importieren. Ich weiß, es ist einfach einfacher, diese Klassen in ein Modulverzeichnis zu kopieren, aber ich denke, das wäre nicht praktisch. – Chisko

9

Sie müssen eine Bindung zwischen Ihrer reinen Java-Bibliothek und Android definieren. Sie können Dependency Injection verwenden, um die Modelle mithilfe der Klassensignatur zu injizieren, und anschließend die parzellierbaren Modelle in der App (oder in einem anderen Projekt, z. B. einem Plug-in) definieren. Oder Sie könnten dasselbe mit Generika erreichen. Denken Sie daran, da die Java-Bibliothek technisch bereits kompiliert wurde, können Sie sie nicht ändern, indem Sie sie in das android-Projekt importieren (ich habe Leute gesehen, die einige Dateien aus einer Abhängigkeit "umschrieben" und sie dann mit dem gesamten ursprünglichen Pfad hinzufügen) den Klassenpfad zu täuschen, aber das ist sehr riskant, da Sie nicht in der Lage sein werden, mit dem Rest des Codes der Abhängigkeit zu interagieren, und wenn sich etwas ändert, wird die Sache kaputt gehen.

Wenn Sie Zugriff auf den Bibliotheksquellcode der Pure Java-Bibliothek haben, ändern Sie ihn, um Fabriken oder Modellanbieter zu verwenden. Wenn nicht, erweitern Sie die Modelle, fügen Sie parzellierbare Unterstützung hinzu und versuchen Sie, diese anstelle der ursprünglichen Modellklassen zu verwenden.

Beispiel:

nehmen wir an, wir ein Modell und einige Funktionen verwenden es:

public class myModel{ 

    private int id; 
    private String name; 

    public void setId(int id){ 
     this.id = id; 
    } 

    //more getters and setters 
} 

public interface myModelCreator<T>{ 
    public myModel create(T toModel); 
    public T uncreate(myModel fromModel); 
} 

public static void doSomething(myModel model){ 
    //some library operations 
} 

Jetzt, in der Android-Projekt:

public class myAndroidModel extends myModel implements Parcelable{ 
    /*Implements the parcelable methods using the class accessors, or you can change the myModel members to protected.*/ 
} 

public class myAndroidModelCreator implements myModelCreator<myAndroidModel>{ 

    @Override 
    public myModel create(myAndroidModel toModel){ 
     //create the myModel using the parcelable class. 
    } 

    @Override  
    public myAndroidModel uncreate(myModel fromModel){ 
     //reverse operation. 
    } 

} 

Jetzt im Android-Projekt, Sie können die Parcelable-Subclass überall verwenden, und jedes Mal, wenn Sie die Bibliothek aufrufen müssen, können Sie die Creator-Schnittstelle mit den Parcelables als Argumente angeben. Eine weitere Alternative wäre die Bibliothek Methodensignaturen zu so etwas wie dies zu ändern:

public static void<T extends myModel> doSomething(T model){ 
    //some library operations 
} 

So können Sie direkt die Parcel Subklassen verbrauchen. Je nach Hierarchie ist dies jedoch nicht möglich. Schließlich könnten Sie versuchen, die Abhängigkeitsinjektion in das Java-Projekt zu implementieren, indem Sie Guice und Roboguice im Android-Projekt verwenden. Da Roboguice Guice verwendet, ist es möglich, dass sie zusammenarbeiten können, aber das ist weit hergeholt.

+0

Vielen Dank für Ihre Eingaben. Die Bibliothek ist nicht kompiliert, ich habe den Quellcode und kann ihn beliebig ändern. Aber was Sie beschreiben, klingt schrecklich kompliziert, nur um eine Klasse eine Schnittstelle implementieren zu lassen. Ich würde mich freuen, wenn du weiter beschreibst oder mich auf ein Tut hinweisst, wo ich das überprüfen kann. – Chisko

+0

Zur Klarstellung: Ich verstehe deinen zweiten Gedanken aber nicht den ersten – Chisko

+0

Ich werde das heute ausprobieren und werde es euch wissen lassen. Danke – Chisko

-2

Erstellen Sie ein Android-Bibliotheksprojekt mit Paket com.domain.libproject

die Quellen alle in src Ordner kopieren.

Aktualisieren Sie JAR-Abhängigkeiten in build.gradle, und danach können Sie Ihre Klasse in der Bibliothek parzellierbar machen.

Lassen Sie mich wissen, wenn irgendwelche Probleme.

Best regds

1

Ich mag Fco P. ‚s Antwort, aber aus Gründen der Vollständigkeit, hier ist eine alternative Antwort.

Verwenden Sie JSON zum Serialisieren von Objekten anstelle von Parcelable. Sie können dann Ihren serialisierten JSON als Zeichenkette in Absicht oder als Zeichenkette in Bündel einfügen.

  • es schneller zu implementieren als Parcel Verwendung mit Bibliotheken wie Google GSON oder Square moshi.
  • es weniger performant als Parcel
+0

Wie gehe ich mit 'bundle.putParcelable()' mit Ihrer Antwort herum? – Chisko

Verwandte Themen