2010-06-13 84 views
2

我有一个android web服务客户端应用程序。我正在尝试使用java标准WS库支持。我已经将应用程序剥离到最低限度,如下所示,以尝试隔离问题。下面是应用程序,Android“java.lang.noclassdeffounderror”异常

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()); 
     } 
    } 
} 

的类tempConvert和tempConvertSoap是在包fau.edu.cse。我在java build pasth中包含了java SE javax库。当android应用程序试图创建“服务”对象时,我得到一个“java.lang.noclassdeffounderror”异常。这两个类tempConvertSoap和TempConvet()由wsimport生成。我也使用javax.jws ..和javax.xml.ws中的几个库。当然,应用程序编译时没有错误并且正确加载。我知道应用程序正在运行,因为我的“try/catch”例程成功捕获错误并将其打印出来。以下是在logcat的说(请注意,它无法找到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 ...

这将是巨大的,如果有人只是有一个答案,但是我正在查看调试策略。我已经采用这个相同的应用程序,并创建了一个标准的Java客户端应用程序,它工作正常 - 当然所有的东西都取出来了。什么是一个好的调试策略?你会推荐什么方法和技术来尝试隔离问题?我在考虑有某种Dalvik虚拟机不兼容导致TempConvert类不能加载。 TempConvert是一个接口类,引用了很多非常棘手的Web服务属性。任何有关调试策略的帮助都会很乐意。

感谢您的帮助, 史蒂夫

+0

移动<uses-library android:name="com.google.android.maps" /><application>标签内解决了这个,你需要对你的网络服务器lib文件夹 – Woot4Moo 2010-06-13 00:39:29

回答

6

这是你的问题:

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

从的javadoc:

如果抛出的Java虚拟机或 ClassLoader实例尝试加载 在类的定义中(作为正常方法调用的部分 或作为的一部分使用新的 表达式创建新实例),并且没有找到 类的定义。

当编译当前正在执行的 类,但不能再找到定义 时,搜索到的类定义 存在。

听起来像您有Android部署或包装问题。尽管有您的假设,但无法找到您的班级。

当你观察违背你的假设的行为时,你应该把它们放在一边,从一开始就检查一切。假设一切都是正确的,尽管你有眼前的证据,但却妨碍了寻找解决方案。

+2

你好, 我想出答案的罐子。 Android不支持任何的javax库。 javax是Android中的一个核心库,它不允许(或者很难尝试)重写自己的javax库。如果您尝试使用任何javax.jars,您将收到若干警告。 Android不支持javax中的大部分功能。因此,如果您尝试使用javax库,那么尝试使用其中一个可用的javax.jars会非常困难。 – 2010-07-26 14:38:38

+0

但这不是一个javax库。 – duffymo 2010-07-26 17:15:35

+2

TempConvert是一个从wsimport创建的类。 TempConvert有几个javax.xml.ws类的引用。我正在使用eclipse IDE,它对插件以外的Android环境一无所知。编译器认为一切正常。 Android加载器(称为dexloader)检查违反的.dex(.class类的Android版本)。如果它发现它不加载类。我把你的phylosphy放在心上,花了3周的时间挖掘Dalvik虚拟机。我做了几个实验来证明我的理论。我现在专注于不同的方法。感谢您的帮助和关心。 – 2010-07-28 01:45:07

13

如果您在Goolge的地图外部库的情况下,使用一个外部库,例如,你必须添加

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

在Android清单的<Application>标签内。XML

相关问题