Android"java.lang.noclassdeffounderror"异常

Ste*_*eld 2 android web-services

我有一个android webservice客户端应用程序.我正在尝试使用java标准的WS库支持.我已将应用程序降至最低,如下所示,以尝试找出问题.以下是申请,

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

... ... BLA BLA BLA ...

如果有人得到答案,那将是很好的,但我正在研究调试策略.我已经采用了相同的应用程序并创建了一个标准的Java客户端应用程序,它工作正常 - 当然所有的android东西都取出了.什么是一个好的调试策略?您会尝试使用哪些方法和技术来尝试隔离问题?我认为存在某种Dalvik VM不兼容性导致TempConvert类无法加载.TempConvert是一个接口类,它引用了许多非常棘手的Web服务属性.任何有关调试策略的帮助都将很高兴.

谢谢你的帮助,史蒂夫

Sam*_*han 13

如果您正在使用外部库,例如在Goolge地图的外部库中您必须添加

<uses-library android:name="com.google.android.maps" />
Run Code Online (Sandbox Code Playgroud)

<Application>在Android Manifest.xml中的标记内


duf*_*ymo 6

这是你的问题:

java.lang.NoClassDefFoundError: fau.edu.cse.TempConvert
Run Code Online (Sandbox Code Playgroud)

来自javadocs:

如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为普通方法调用的一部分或作为使用新表达式创建新实例的一部分)并且无法找到类的定义,则抛出该异常.

搜索的类定义在编译当前正在执行的类时存在,但无法再找到该定义.

听起来你有Android部署或打包问题.尽管你有假设,它找不到你的班级.

当您观察到与您的假设相反的行为时,您应该将它们放在一边并从头开始检查所有内容.假设一切都是正确的,尽管你眼前有证据,但却妨碍了寻找解决方案.

  • 你好,我找到了答案.Android不支持任何javax库.javax是Android中的核心库,它不允许(或试图真正努力)覆盖自己的javax库.如果您尝试使用任何javax .jars,您将收到几个警告.Android不支持javax中的大多数功能.因此,如果您尝试使用javax库,那么尝试使用其中一个可用的javax .jars几乎没有运气. (2认同)
  • TempConvert是一个从wsimport创建的类.TempConvert有几个javax.xml.ws类引用.我正在使用eclipse IDE,除了插件之外,它对Android环境一无所知.编译器认为一切正常.名为dexloader的Android加载程序检查.dex(.class的android版本)是否存在违规行为.如果找到它们则不加载该类.我把你的phylosphy铭记在心,花了3个星期的时间深入Dalvik VM.我做了几次实验来证明我的理论.我现在专注于一种不同的方法.感谢您的帮助和关注. (2认同)
  • 我提到编译器不了解Android环境.好吧,我将不得不退缩并说它知道一点.我使用的是早期版本的Eclipse.我下载了最新版本,它开始在我的构建中咆哮.不是很清楚,但足以知道我有一些构建问题.就像一个好的硬件技术人员总是首先检查以确保设备已插入...软件工程师应该经常检查以确保他们有最新的代码版本!问题仍然是javax库,但早期的编译器没有捕获构建问题. (2认同)