2012-03-29 5 views
5

Ich versuche, cocos2d in eine bereits existierende App einzubinden. Ich habe Dinge, die Eclipse-Weise getan, wie die Einstellung „IsLibrary kann“ und das Hinzufügen des Bibliothek-Projektes zu dem Build-Pfad in Eclipse, und ich habe die folgende Abhängigkeit in meiner App pom.xml:Ein Eclipse "Android Library" -Projekt hinzufügen und über Maven erstellen

<dependency> 
    <groupId>cocos2d_android</groupId> 
    <artifactId>cocos2d_android</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <scope>provided</scope> 
</dependency> 

Ich dachte, das wäre‘ Ich kümmere mich um das Problem, aber wenn ich baue, scheint die Bibliothek nicht enthalten zu sein. Ich weiß das, weil, wenn ich eine Aktion starten, SimpleGame, Referenzierung eine der Klassen in der cocos2d Quelle, die Aktivität stirbt und ich bekomme diese Stacktrace in DDMS:

E/AndroidRuntime(10621): FATAL EXCEPTION: main E/AndroidRuntime(10621): java.lang.NoClassDefFoundError: org.cocos2d.opengl.CCGLSurfaceView E/AndroidRuntime(10621): at com.xyz.game.SimpleGame.onCreate(SimpleGame.java:22) ...

Ich bin für zwei Dinge suchen:

1) ein zuverlässiger Weg, um herauszufinden, ob eine bestimmte Klasse/jar/was auch immer nach oben in mein apk verpackt wurde, wie die Schritte bis zu diesem Punkt in meiner app sind lang und kompliziert jetzt

2) etwas zu bekommen in der Manifest oder pom.xml für die Hauptanwendung oder das Bibliotheksprojekt scheint zu fehlen - s Irgendetwas musste Maven signalisieren, um dieses andere Projekt aufzunehmen - was ist es?

Ich benutze Maven 3.0.4 und 3.0.0-alpha-13 des Plugins, Aufbau für Level 8 und höher.

Antwort

4

1) ein zuverlässiger Weg, um herauszufinden, ob eine bestimmte Klasse/jar/was auch immer nach oben in mein apk verpackt wurde, wie die Schritte bis zu diesem Punkt in meiner app ist lang und kompliziert jetzt

zu bekommen

Build-Projekt von Befehlszeile (dh mvn saubere Installation), maven ausgegeben ausführliche Protokolle während jeder einzelnen Phase/Ziel zu bauen, in dem dex Ziel, können Sie so etwas wie dies sehen:

[INFO] --- android-maven-plugin: 3.1.1: dex (default-dex) @ meinprojekt ---
[INFO] C: \ Programme \ Java \ jdk1.6.0_21 \ jre \ bin \ java [-Xmx1024M, -jar, C: \ Progr am Dateien \ Android \ android-sdk-r16 \ plattform-tools \ lib \ dx.jar, --dex, --output = C: \ workspace \ meinprojekt \ target \ classes.dex, C: \ workspace \ meinprojekt \ target \ classes, C: \ maven \ repository \ cocos2d_android \ cocos2d_android \ 1.0.0-SNAPSHOT \ cocos2d_android-1.0.0-SNAPSHOT.apklib, C: \ maven \ repository \ com \ code google \ \ Gson \ Gson \ 1.7.1 \ Gson-1.7.1.jar, ... ...]

Die Android Library Project ist eigentlich dex-ed als cocos2d_android-1.0.0 -SNAPSHOT.apklib mit einigen anderen regulären jar-Bibliotheksarchiven.


2) Etwas im Manifest oder pom.xml entweder für die Hauptanwendung oder das Bibliotheksprojekt zu fehlen scheint - etwas Maven zu signalisieren erforderlich, um dieses andere Projekt zu holen - was ist es?

Es ist ApkLib, das Archiv der Android Library Project einfach eine Zip ist (src/res /, AndroidManifest.xml und etc.). Normalerweise erstellen/implementieren wir unser eigenes Android-Bibliotheksprojekt mit dem abhängigen Android-Projekt als Multi-Modul-Maven-Projekt. Dies ist jedoch nicht notwendig, falls Sie ein Android-Bibliotheksprojekt benötigen, das von anderen Entwicklern geschrieben wurde. Dank der Entwickler, android-Maven-Plugin bereits nicht-Maven Android Bibliotheksprojekte unterstützt Besuche Compatible with non-Maven Android Library Projects:

Die erzeugte .apklib Datei wird das Layout einer Standard-Android/Eclipse-Bibliothek-Projekt haben. Dies bedeutet, dass unabhängig von Ihrem Maven-Layout das Layout in der .apklib-Datei so aussieht, dass der Quellcode in "src /" statt "src/main/java /" liegt, aber in einer Android/Maven-Anwendung korrekt interpretiert wird Projekt. Dies soll mit Bibliotheksprojekten von Nicht-Maven-Entwicklern kompatibel sein, was wichtig ist, um die Entwicklergemeinde von Android zu vergrößern.

Verwenden Sie andere nicht-Maven Entwickler-Bibliotheken

Es bedeutet auch, wir alle externen Android-Bibliothek-Projekt Zip-Datei (von Nicht-Maven Entwickler) nehmen können und mvn installieren: install-Datei ... auf es und einfach anfangen, es als eine Abhängigkeit zu verwenden.

Teilen Sie Ihre .apklib mit nicht-Maven Entwickler

Um Ihre .apklib Datei mit einem Nicht-Maven Entwickler zu teilen, werden sie wahrscheinlich wohler fühlen, wenn Sie es umbenennen in .zip. Sie können es dann einfach in ein Verzeichnis entpacken und von dort aus benutzen.

So ist die Abhilfe ist:

  1. Packen Sie Ihre Android Library Project in Zip-Archiv richtig, dann ist es umbenennen, um something.apklib.
  2. Installieren Sie something.apklib in Ihrem lokalen Maven-Repository, indem Sie mvn install: install-file verwenden.
  3. In jedem Android-Projekt, die Bibliothek Abhängigkeit erfordert, einfach mit:

    <dependency> 
        <groupId>cocos2d_android</groupId> 
        <artifactId>cocos2d_android</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
        <type>apklib</type> 
    </dependency> 
    

Check out Samples auf Android-Maven-Plugin Website, um zu sehen, wie man richtig nutzen apklib.

+0

Danke yorkw!Aber gibt es einen Weg für Maven, um das Projekt in Angriff zu nehmen? Meine Kopie von cocos2d ist ein Nur-Lese-Klon von GitHub und ich würde die Bequemlichkeit lieben, diesen Prozess nicht jedes Mal zu wiederholen, wenn eine Änderung aus github kommt ... –

+0

Ich bin nicht bewusst, wenn es irgendwelche Maven-Plugins gibt, die ziehen können, Zip und automatisch von Github installieren. Wie oft werden Sie Ihre App aktualisieren? Aus einer produktiven Perspektive ist es unwahrscheinlich, dass die erforderlichen Abhängigkeiten von Apps regelmäßig oder täglich aktualisiert oder aktualisiert werden müssen. Die manuelle Problemumgehung ist die einzige Möglichkeit, Android-Maven-Plugin zur Verfügung gestellt und ich denke, es ist akzeptabel für die produktive Wartung in den meisten Bedingungen. – yorkw

+0

Kurzinfo: Der obige Hyperlink "Samples" fehlt das letzte "s" (sollte http://code.google.com/p/maven-android-plugin/wiki/Samples sein). SO ließ mich nicht eine 1-Zeichen-Bearbeitung machen. –

1

Scope sollte nicht provided sein. Mittel vorgesehen:

zur Verfügung gestellt - das ist ähnlich wie die Kompilierung, sondern zeigen Sie den JDK oder einen Behälter erwarten, dass es zu schaffen, zur Laufzeit. Es ist nur im Compilierungs- und Testklassenpfad verfügbar und nicht transitiv.

Verwenden Sie stattdessen compile.

Zusätzlicher Tipp: Da compile die Standardeinstellung ist, können Sie die Zeile <scope>provided</scope> entfernen.

+0

Lustig sollten Sie erwähnen, dass - mit dem 'compile' Standard, bekomme ich einen doppelten Eintrag Fehler beim Versuch, die .apk zu bauen. Natürlich habe ich irgendwo eine zusätzliche Abhängigkeitsspezifikation, aber ich bin mir nicht sicher, wo - ich habe bereits versucht, das Projekt aus dem Build-Pfad in Eclipse zu entfernen, nicht sicher, was ich sonst noch versuchen sollte. –

+0

@ BryM. Dies könnte durch eine Abhängigkeit in der cocos2d_android verursacht werden, die bereits in der Android-Bibliothek vorhanden ist. Sie können die doppelte Klasse wahrscheinlich in Ihrem Klassenpfad finden und die Maven-Abhängigkeit verwenden, um die redundante Abhängigkeit von cocos2d_android zu löschen. –