2010-06-13 6 views
2

J'ai une application client android webservice. J'essaie d'utiliser le support de bibliothèque WS standard Java. J'ai dépouillé l'application au minimum, comme indiqué ci-dessous, pour essayer d'isoler le problème. Ci-dessous l'application,Android "java.lang.noclassdeffounderror" exception

package fau.edu.cse; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class ClassMap extends Activity { 

    TextView displayObject; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     // Build Screen Display String 
     String screenString = "Program Started\n\n"; 

     // Set up the display 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     displayObject = (TextView)findViewById(R.id.TextView01); 

     screenString = screenString + "Inflate Disaplay\n\n"; 

     try { 
     // Set up Soap Service 
     TempConvertSoap service = new TempConvert().getTempConvertSoap(); 

     // Successful Soap Object Build 
     screenString = screenString + "SOAP Object Correctly Build\n\n"; 

     // Display Response 
     displayObject.setText(screenString); 
     } 
     catch(Throwable e){ 
    e.printStackTrace(); 
    displayObject.setText(screenString +"Try Error...\n" + e.toString()); 
     } 
    } 
} 

Les classes tempConvert et tempConvertSoap sont dans le paquet fau.edu.cse. J'ai inclus les bibliothèques java SE javax dans java build pasth. Lorsque l'application android essaie de créer l'objet "service", j'obtiens une exception "java.lang.noclassdeffounderror". Les deux classes tempConvertSoap et TempConvet() sont générées par wsimport. J'utilise également plusieurs bibliothèques de javax.jws .. et javax.xml.ws .. Bien sûr, l'application compile sans erreur et se charge correctement. Je sais que l'application fonctionne parce que ma routine "try/catch" réussit à attraper l'erreur et à l'imprimer. Voici ce qui est dans le logcat dit (avis qu'il ne peut pas trouver TempConvert),

06-12 22:58:39.340: WARN/dalvikvm(200): Unable to resolve superclass of Lfau/edu/cse/TempConvert; (53) 
06-12 22:58:39.340: WARN/dalvikvm(200): Link of class 'Lfau/edu/cse/TempConvert;' failed 
06-12 22:58:39.340: ERROR/dalvikvm(200): Could not find class 'fau.edu.cse.TempConvert', referenced from method fau.edu.cse.ClassMap.onCreate 
06-12 22:58:39.340: WARN/dalvikvm(200): VFY: unable to resolve new-instance 21 (Lfau/edu/cse/TempConvert;) in Lfau/edu/cse/ClassMap; 
06-12 22:58:39.340: DEBUG/dalvikvm(200): VFY: replacing opcode 0x22 at 0x0027 
06-12 22:58:39.340: DEBUG/dalvikvm(200): Making a copy of Lfau/edu/cse/ClassMap;.onCreate code (252 bytes) 
06-12 22:58:39.490: DEBUG/dalvikvm(30): GC freed 2 objects/48 bytes in 273ms 
06-12 22:58:39.530: DEBUG/ddm-heap(119): Got feature list request 
06-12 22:58:39.620: WARN/Resources(200): Converting to string: TypedValue{t=0x12/d=0x0 a=2 r=0x7f050000} 
06-12 22:58:39.620: WARN/System.err(200): java.lang.NoClassDefFoundError: fau.edu.cse.TempConvert 
06-12 22:58:39.830: WARN/System.err(200):  at fau.edu.cse.ClassMap.onCreate(ClassMap.java:26) 
06-12 22:58:39.830: WARN/System.err(200):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
06-12 22:58:39.830: WARN/System.err(200):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
06-12 22:58:39.830: WARN/System.err(200):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
06-12 22:58:39.830: WARN/System.err(200):  at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
06-12 22:58:39.880: WARN/System.err(200):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
06-12 22:58:39.880: WARN/System.err(200):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-12 22:58:39.880: WARN/System.err(200):  at android.os.Looper.loop(Looper.java:123) 
06-12 22:58:39.880: WARN/System.err(200):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
06-12 22:58:39.880: WARN/System.err(200):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-12 22:58:39.880: WARN/System.err(200):  at java.lang.reflect.Method.invoke(Method.java:521) 
06-12 22:58:39.880: WARN/System.err(200):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
06-12 22:58:39.880: WARN/System.err(200):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
06-12 22:58:39.880: WARN/System.err(200):  at dalvik.system.NativeStart.main(Native Method) 

... Bla ... Bla ... bla

Ce serait formidable si quelqu'un vient d'avoir une réponse , cependant je regarde les stratégies de débogage. J'ai pris cette même application et créé une application client Java standard et cela fonctionne bien - bien sûr, avec tous les trucs Android enlevés. Quelle serait une bonne stratégie de débogage? Quelles méthodes et techniques recommanderiez-vous d'essayer d'isoler le problème? Je pense qu'il y a une sorte d'incompatibilité de Dalvik VM qui provoque le chargement de la classe TempConvert. TempConvert est une classe d'interface qui fait référence à de nombreux attributs de service Web très complexes. Toute aide avec les stratégies de débogage serait volontiers appréciée.

Merci pour l'aide, Steve

+0

vous devez avoir les pots sur vos serveurs Web de dossier lib – Woot4Moo

Répondre

6

Voici votre problème:

java.lang.NoClassDefFoundError: fau.edu.cse.TempConvert 

De la javadoc:

Jeté si la machine virtuelle Java ou une instance de ClassLoader tente de charger dans la définition d'une classe (comme partie d'un appel de méthode normale ou dans le cadre de en créant une nouvelle instance en utilisant la nouvelle expression) et aucune définition de la classe n'a pu être trouvée.

La cherchés définition de classe existait au moment de la compilation de la classe en cours d'exécution, mais la définition ne peut plus être trouvé.

Il semble que vous ayez un problème de déploiement ou d'encapsulation Android. Il ne peut pas trouver votre classe, malgré vos hypothèses.

Lorsque vous observez un comportement qui contredit vos hypothèses, vous devez les mettre de côté et vérifier tout depuis le début. En supposant que tout est correct, malgré les preuves que vous avez sous les yeux, vous empêchez de trouver une solution.

+2

Bonjour, je me suis dit la réponse. Android ne supporte pas les bibliothèques javax. javax est une bibliothèque de base dans Android et il ne permet pas (ou essaie vraiment dur) de surcharger sa propre bibliothèque javax. Si vous essayez d'utiliser javax .jars, vous obtiendrez plusieurs avertissements. Android ne supporte pas la plupart des fonctionnalités de javax. Donc, si vous essayez d'utiliser une bibliothèque javax, vous n'avez pas beaucoup de chance en essayant d'utiliser l'un des javax javax disponibles. –

+0

Mais ce n'est pas une bibliothèque javax. – duffymo

+2

TempConvert est une classe créée à partir de wsimport. TempConvert a plusieurs références de classe javax.xml.ws. J'utilise l'IDE eclipse qui ne connaît rien de l'environnement Android autre que les plug-ins. Le compilateur pense que tout va bien. Le chargeur Android, appelé dexloader, examine le .dex (version android de .class) pour les violations. S'il les trouve, il ne charge pas la classe. J'ai pris votre phylosophie à cœur et j'ai passé trois semaines à creuser dans la machine virtuelle Dalvik. J'ai fait plusieurs expériences pour prouver ma théorie. Je suis maintenant concentré sur une approche différente. Merci pour votre aide et votre souci. –

13

Si que vous utilisez une bibliothèque externe, par exemple dans le cas de la bibliothèque externe de carte Goolge vous devez ajouter

<uses-library android:name="com.google.android.maps" /> 

dans la balise <Application> dans Manifest Android.xml

2

je résolus en déplaçant <uses-library android:name="com.google.android.maps" /> à l'intérieur des balises <application> dans mon AndroidManifest.xml

Questions connexes