2012-08-07 20 views
0

我正在安装一个tcp服务器,我能够得到示例工作,但没有将示例应用到我自己的应用程序。我不断收到一个NoClassDefFound错误,并尝试删除内部类并创建单独的类,但它似乎没有工作。我已经包含了我的LogCats和java文件。

logcat的

08-07 14:34:03.642: W/dalvikvm(332): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
08-07 14:34:03.642: E/AndroidRuntime(332): FATAL EXCEPTION: main 
08-07 14:34:03.642: E/AndroidRuntime(332): java.lang.NoClassDefFoundError: com.example.com.proto1.AndroidNetCommunicationClientActivityInner$1 
08-07 14:34:03.642: E/AndroidRuntime(332): at com.example.com.proto1.AndroidNetCommunicationClientActivityInner.<init>(AndroidNetCommunicationClientActivityInner.java:103) 
08-07 14:34:03.642: E/AndroidRuntime(332): at java.lang.Class.newInstanceImpl(Native Method) 
08-07 14:34:03.642: E/AndroidRuntime(332): at java.lang.Class.newInstance(Class.java:1409) 
08-07 14:34:03.642: E/AndroidRuntime(332): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
08-07 14:34:03.642: E/AndroidRuntime(332): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561) 
08-07 14:34:03.642: E/AndroidRuntime(332): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
08-07 14:34:03.642: E/AndroidRuntime(332): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
08-07 14:34:03.642: E/AndroidRuntime(332): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
08-07 14:34:03.642: E/AndroidRuntime(332): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-07 14:34:03.642: E/AndroidRuntime(332): at android.os.Looper.loop(Looper.java:123) 
08-07 14:34:03.642: E/AndroidRuntime(332): at android.app.ActivityThread.main(ActivityThread.java:3683) 
08-07 14:34:03.642: E/AndroidRuntime(332): at java.lang.reflect.Method.invokeNative(Native Method) 
08-07 14:34:03.642: E/AndroidRuntime(332): at java.lang.reflect.Method.invoke(Method.java:507) 
08-07 14:34:03.642: E/AndroidRuntime(332): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
08-07 14:34:03.642: E/AndroidRuntime(332): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
08-07 14:34:03.642: E/AndroidRuntime(332): at dalvik.system.NativeStart.main(Native Method) 

主要TCP的java

import net.client.MyRequest; 
import net.client.MyResponse; 
import net.client.R; 
import eneter.messaging.diagnostic.EneterTrace; 
import eneter.messaging.endpoints.typedmessages.*; 
import eneter.messaging.messagingsystems.messagingsystembase.*; 
import eneter.messaging.messagingsystems.tcpmessagingsystem.TcpMessagingSystemFactory; 
import eneter.net.system.EventHandler; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.*; 

public class AndroidNetCommunicationClientActivityInner extends Activity { 

    // UI controls 
    private Handler myRefresh = new Handler(); 
    private EditText myMessageTextEditText; 
    private EditText myResponseEditText; 
    private Button mySendRequestBtn; 

    // Sender sending MyRequest and as a response receiving MyResponse. 
    private IDuplexTypedMessageSender<MyResponse, MyRequest> mySender; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Get UI widgets. 
     myMessageTextEditText = (EditText) findViewById(R.id.messageTextEditText); 
     myResponseEditText = (EditText) findViewById(R.id.messageLengthEditText); 
     mySendRequestBtn = (Button) findViewById(R.id.sendRequestBtn); 

     // Subscribe to handle the button click. 
     mySendRequestBtn.setOnClickListener(myOnSendRequestClickHandler); 

     try { 
      openConnection(); 
     } catch (Exception err) { 
      EneterTrace.error("Open connection failed.", err); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     // Stop listening to response messages. 
     mySender.detachDuplexOutputChannel(); 
    } 

    private void openConnection() throws Exception { 
     // Create sender sending MyRequest and as a response receiving 
     // MyResponse 
     IDuplexTypedMessagesFactory aSenderFactory = new DuplexTypedMessagesFactory(); 
     mySender = aSenderFactory.createDuplexTypedMessageSender(
       MyResponse.class, MyRequest.class); 

     // Subscribe to receive response messages. 
     mySender.responseReceived().subscribe(myOnResponseHandler); 

     // Create TCP messaging for the communication. 
     // Note: 10.0.2.2 is a special alias to the loopback (127.0.0.1) 
     // on the development machine. 
     IMessagingSystemFactory aMessaging = new TcpMessagingSystemFactory(); 
     IDuplexOutputChannel anOutputChannel = aMessaging 
       .createDuplexOutputChannel("tcp://10.0.2.2:8060/"); 

     // Attach the output channel to the sender and be able to send 
     // messages and receive responses. 
     mySender.attachDuplexOutputChannel(anOutputChannel); 
    } 

    private void onSendRequest(View v) { 
     // Create the request message. 
     MyRequest aRequestMsg = new MyRequest(); 
     aRequestMsg.Text = myMessageTextEditText.getText().toString(); 

     // Send the request message. 
     try { 
      mySender.sendRequestMessage(aRequestMsg); 
     } catch (Exception err) { 
      EneterTrace.error("Sending the message failed.", err); 
     } 
    } 

    private void onResponseReceived(Object sender, 
      final TypedResponseReceivedEventArgs<MyResponse> e) { 
     // Display the result - returned number of characters. 
     // Note: Marshal displaying to the correct UI thread. 
     myRefresh.post(new Runnable() { 
      public void run() { 
       myResponseEditText.setText(Integer.toString(e 
         .getResponseMessage().Length)); 
      } 
     }); 
    } 

    private EventHandler<TypedResponseReceivedEventArgs<MyResponse>> myOnResponseHandler = new EventHandler<TypedResponseReceivedEventArgs<MyResponse>>() { 
     public void onEvent(Object sender, 
       TypedResponseReceivedEventArgs<MyResponse> e) { 
      onResponseReceived(sender, e); 
     } 
    }; 

    private OnClickListener myOnSendRequestClickHandler = new OnClickListener() { 
     public void onClick(View v) { 
      onSendRequest(v); 
     } 
    }; 
} 

曾经是内部类

public class MyRequest { 
    public String Text; 
} 

曾经是内第二类

public class MyResponse { 
    public int Length; 
} 

清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.com.proto1" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 

    <application 
     android:icon="@drawable/theeye" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".mainj" 
      android:label="@string/title_activity_mainj" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".menu" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MENU" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".Infoactive" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.INFOSCREEN" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".VoicePrompts" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.VOICEPROMPTS" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".VPon" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.VPON" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".VPoff" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.VPOFF" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
     <!-- android name must match the name of the java you want to use --> 
     <activity 
      android:name=".VoiceRecognition" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.RECOGNITIONMENU" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".Recognition" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="ACTION_RECOGNIZE_SPEECH" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".SpeakingAndroid" 
      android:label="tts" > 
      <intent-filter> 
       <action android:name="android.intent.action.SPEAK" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".AndroidNetCommunicationClientActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="ANDROID_NET" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".AndroidNetCommunicationClientActivityInner" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="ANDROID_NET2" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

你在使用任何外部'.jar'文件吗?如果是,则请尝试[this](http://stackoverflow.com/a/11824038/940096)或者,您是否在AndroidManifest.xml文件中声明了所有活动? – Praveenkumar 2012-08-07 14:46:57

+0

我现在正在添加清单。我正在使用一个外部jar,但我已正确放入。 – 2012-08-07 15:21:34

+0

@SamBevins你能指出代码中的第103行吗? $符号表示匿名内部类。 – 2012-08-07 16:34:39

回答

2

我不能确定有关错误的,但$ 1指一样,你在这里使用

private void onResponseReceived(Object sender, 
     final TypedResponseReceivedEventArgs<MyResponse> e) { 
    // Display the result - returned number of characters. 
    // Note: Marshal displaying to the correct UI thread. 
    myRefresh.post(new Runnable() { 
     public void run() { 
      myResponseEditText.setText(Integer.toString(e 
        .getResponseMessage().Length)); 
     } 
    }); 
} 

从技术上讲,你是一个匿名内部类(没有名字的类)创建一个名为$ 1的Runnable的子类,并且这个类是内部的。不知道错误是什么,虽然我会尝试重新编译所有东西

+0

奇怪的是,编码与我的工作示例相同,不会返回任何错误。我如何重新编译? – 2012-08-07 15:20:19

+0

@SamBevins然后尝试清理您的项目,然后再试一次,或重新启动IDE – 2012-08-07 15:37:38

+0

我已经做到了多次,但我仍然有同样的错误在我的问题 – 2012-08-07 15:57:17

0

你还没有重新编译所有东西。无论是你还是你的类路径中有一个任性的入口。

0

我想我在想通了这个问题,

在清单文件的包被宣布为AndroidNetCommunicationClientActivityInner作为

package="com.example.com.proto1" 

但实际上你没有在包类,而不是因为在指定的JAVA文件中没有包声明。

但是android会寻找该类的包,因此会抛出java.lang.NoClassDefFoundError

+0

好吧,我更换了两个班,但我仍然有完全相同的问题 – 2012-08-08 13:25:08

+0

@SamBevins问题是最有可能与包声明的东西,你试图找出它? – 2012-08-08 13:47:27

+0

我对编程相当陌生,所以我无法弄清楚问题所在。我试图弄明白。我不明白的是我的示例代码如何工作,但在我的实际应用程序中使用时不起作用。我检查了所有的编码,但它看起来是一样的 – 2012-08-08 14:17:12