4 votes

Ajouter un jar externe au projet Android dans eclipse

Je suis en train de construire un projet Android simple dans eclipse qui utilise la fonction google-api-java-client . J'essaie de suivre ce tutoriel pour le faire fonctionner. J'ai cherché dans SO des réponses sur la façon d'ajouter des JARs à un projet Android dans Eclipse. La plupart d'entre elles recommandent d'ajouter les JARs dans le répertoire lib/ dans le projet Android, puis en ajoutant ces JARs au chemin de construction du projet. J'ai fait ces deux choses. Le projet se compile bien (en tout cas, Eclipse ne se plaint d'aucune erreur). Mais lorsque je lance l'application Android dans mon émulateur, j'obtiens ClassDefNotFoundError à chaque fois que j'essaie d'instancier une classe dans le fichier google-api-java-client JAR. Par exemple

new com.google.api.client.http.apache.ApacheHttpTransport();

Soulevez ClassDefNotFoundError .

Voici le code qui provoque l'erreur :

package com.mycom.android;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;

public class SearchRunner implements OnClickListener {

    private static final String API_KEY = "AIzaSyA1Mg3xWXfoov4HdPUzYY2NwTxuvCev1-E";
    private static final String PLACES_SEARCH_URL = "";

    @Override
    public void onClick(View v) {
        EditText editText = (EditText) v;
        String searchText = editText.getText().toString();
        runSearch(searchText);
    }

    protected void runSearch(String searchText) {
        new com.google.api.client.http.apache.ApacheHttpTransport();
    }

}

Voici une sortie plus complète de Eclipse LogCat :

12-21 15:42:11.402: E/dalvikvm(3412): Could not find class 'com.google.api.client.http.apache.ApacheHttpTransport', referenced from method com.mycom.android.SearchRunner.runSearch
12-21 15:42:11.402: W/dalvikvm(3412): VFY: unable to resolve new-instance 70 (Lcom/google/api/client/http/apache/ApacheHttpTransport;) in Lcom/mycom/android/SearchRunner;
12-21 15:42:11.402: D/dalvikvm(3412): VFY: replacing opcode 0x22 at 0x0000
12-21 15:42:11.402: D/dalvikvm(3412): DexOpt: unable to opt direct call 0x00ca at 0x02 in Lcom/mycom/android/SearchRunner;.runSearch
12-21 15:42:11.682: I/MapActivity(3412): Handling network change notification:CONNECTED
12-21 15:42:11.682: E/MapActivity(3412): Couldn't get connection factory client
12-21 15:42:11.791: D/gralloc_goldfish(3412): Emulator without GPU emulation detected.
12-21 15:42:12.532: D/dalvikvm(3412): GC_CONCURRENT freed 102K, 3% free 10520K/10823K, paused 5ms+7ms
12-21 15:42:18.422: D/AndroidRuntime(3412): Shutting down VM
12-21 15:42:18.422: W/dalvikvm(3412): threadid=1: thread exiting with uncaught exception (group=0x409951f8)
12-21 15:42:18.482: E/AndroidRuntime(3412): FATAL EXCEPTION: main
12-21 15:42:18.482: E/AndroidRuntime(3412): java.lang.NoClassDefFoundError: com.google.api.client.http.apache.ApacheHttpTransport
12-21 15:42:18.482: E/AndroidRuntime(3412):     at com.mycom.android.SearchRunner.runSearch(SearchRunner.java:20)

5voto

maxenglander Points 1472

J'ai résolu le problème en suivant les étapes suivantes ces instructions étape par étape. Quand j'ai commencé à mettre en place le projet :

  1. J'ai importé les fichiers JAR depuis le google-api-java-client dans le projet de mon projet lib/ carpeta
  2. J'ai fait un clic droit lib/google-api-client... et sélectionné Build Path > Add To Build Path

À ce stade, dans Eclipse, un certain nombre de bibliothèques apparaissent dans la section "Bibliothèques référencées" de mon projet :

jsr305-1.3.9.jar
gson-1.7.1.jar
guava-r09.jar
junit-4.8.2.jar
httpclient-4.0.3.jar
httpcore-4.0.1.jar
commons-logging-1.1.1.jar
commons-codec-1.3.jar
jackson-core-asl-1.9.1.jar
xpp3-1.1.4c.jar
protobuf-java-2.2.0.jar
google-http-client-1.6.0-beta.jar
google-oauth-client-1.6.0-beta.jar
google-api-client-1.6.0-beta.jar

Cependant, lorsque je suis allé dans Projet > Propriétés > Chemin de construction de Java > Bibliothèques, j'ai vu que seule l'adresse de l'ordinateur de l'utilisateur était indiquée. google-api-client... a été répertorié. Lorsque j'ai essayé d'exécuter le projet, j'ai obtenu le message suivant NoClassDefFounError para ApacheHttpTransport comme indiqué dans le message original. C'est parce que cette classe est définie dans google-http-client !. En ajoutant manuellement google-http-client au chemin de construction, le problème est résolu.

Leçon apprise : ce n'est pas parce qu'un JAR est listé dans les "Referenced Libraries" d'un projet Eclipse que ces JARs sont inclus dans le chemin de construction du projet.

0voto

letroll Points 738

Peut-être des importations ? ctrl+shift+o fait quelque chose ?

Si non, je ne suis pas sûr que vous devez instancier la bonne classe, avec cette erreur

0voto

Graham Smith Points 7963

Oui, placez le(s) jar(s) dans le dossier lib et ajoutez le projet au chemin de construction (section propriétés) de votre projet. Eclipse va nettoyer et construire après. Vous devriez voir que le fichier jar est utilisé car il apparaîtra dans la section "libraries" sous la bibliothèque Android.

Pour faire référence, utilisez import some.package.com. Comme le dit letroll, ctrl+shift+o devrait trier les importations pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X