ClassNotFoundException bei readObject

Hi,

ich möchte von meinem Smartphone über eine Socketverbindung an meinen PC ein Objekt der Klasse DataInfoPhaseOne schicken.
Dabei wird allerdings eine ClassNotFoundException geworfen.

Ich habe im Projektordner für das Smartphone die Java Datei DataInfoPhaseOne.java abgelegt.
package com.smartphone.DataInfoPhaseOne

Im Projektordner für den PC habe ich auch die Java Datei DataInfoPhaseOne.java abgelegt.
package com.pcserver.DataInfoPhaseOne

Ich glaube mittlerweile in den verschiedenen package Namen liegt der Fehler.
Auch wenn com.smartphone.DataInfoPhaseOne und com.pcserver.DataInfoPhaseOne genau gleich aussehen,
so stellen sie dennoch aufgrund ihrer verschiedenen package Namen unterschiedliche Klassen dar.

Wie löse ich das Problem? Wie geht man da üblicherweise vor?

Smartphone

package com.smartphone.DataInfoPhaseOne
....
...
...

	public void sendData(String filePath)
	{
		try
		{	
			DataInfoPhaseOne dataInfoPhaseOne = new DataInfoPhaseOne("dataType", "sender", "fileName", false);
			ObjectOutputStream o = new ObjectOutputStream(this.out);
			o.writeObject(dataInfoPhaseOne);
		}
	    catch (Exception e)
	    {
	        e.printStackTrace();
	    }
	}

Server Seite (PC)

package com.pcserver.DataInfoPhaseOne
....
...
...

ObjectInputStream i = new ObjectInputStream(this.in);
    		
				try 
				{
					Object receivedObject = i.readObject();
					if (receivedObject instanceof DataInfoPhaseOne)
					{
						System.out.println("Ein DataInfoPhaseOne Objekt ist angekommen");
						DataInfoPhaseOne dataInfoPhaseOne = (DataInfoPhaseOne) receivedObject;
						System.out.println("dataType: " + dataInfoPhaseOne.getDataType());
						System.out.println("fileName: " + dataInfoPhaseOne.getFileName());
						System.out.println("sender: " + dataInfoPhaseOne.getSender());
						System.out.println("hideFile: " + dataInfoPhaseOne.getHideFile());
					}
					else
					{
						System.out.println("das war kein DataInfoPhaseOne Objekt");
					}
				}
				catch (ClassNotFoundException e)
				{
					e.printStackTrace();
				}

import java.io.Serializable;

public class DataInfoPhaseOne implements Serializable
{
	private static final long serialVersionUID = 7109708812051889863L;
	private String dataType;
	private String sender;
	private String fileName;
	private boolean hideFile;
	
	public DataInfoPhaseOne(String dataType, String sender, String fileName, boolean hideFile)
	{
		this.dataType = dataType;
		this.sender = sender;
		this.fileName = fileName;
		this.hideFile = hideFile;
	}
	
	
	public String getDataType()
	{
		return this.dataType;
	}
	
	
	public String getSender()
	{
		return this.sender;
	}
	
	
	public String getFileName()
	{
		return this.fileName;
	}
	
	
	public boolean getHideFile()
	{
		return this.hideFile;
	}
}

java.lang.ClassNotFoundException: com.smartphone.DataInfoPhaseOne
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at java.io.ObjectInputStream.resolveClass(Unknown Source)
        at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
        at java.io.ObjectInputStream.readClassDesc(Unknown Source)
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        at Model.DataHandler.run(DataHandler.java:78)

Eine .java Datei ist nur eine Textdatei mit Source Code. Diese muss erst kompiliert werden und liegt dann als .class Datei vor.

Und ganz wichtig:

[QUOTE=BlupBlup;68241]package com.smartphone.DataInfoPhaseOne

package com.pcserver.DataInfoPhaseOne[/QUOTE]
Das Package ist wesentlicher Bestandteil zur „Identifikation“ einer Klasse.
com.smartphone.DataInfoPhaseOne.class ist einer andere Klasse als com.pcserver.DataInfoPhaseOne.class

Die einzige Möglichkeit ist auf beiden „Seiten“ die selbe Klasse zu verwenden - inkl. Package.

[QUOTE=_Michael;68262]
Die einzige Möglichkeit ist auf beiden “Seiten” die selbe Klasse zu verwenden - inkl. Package.[/QUOTE]

Genau das habe ich mir gedacht. Aber ich weiß nicht wie ich das realisiere. Ich habe die DataInfoPhaseOne.java Datei mal auf meinen Desktop kopiert
und über die Konsole kompiliert, so dass ich anschließend eine .class Datei hatte.

Der Konsolenbefehl:
C:\Program Files\Java\jdk1.7.0_21\bin>javac C:/Users/me/Desktop/DataInfoPhaseOne.java

Nur weiß ich halt jetzt nicht genau was ich damit machen soll. Soll ich die .class Datei in Eclipse in den Projektordner des Servers und des Smartphones reinkopieren?
Und wenn ja wo soll ich sie da genau ablegen im src Ordner oder einen anderen Unterordner?
Wenn ich den Server Projektordner anschließend mit Eclipse in eine ausführbare jar Datei zusammenfasse, kommt es dann zu Problemen, wenn da schon eine .class Datei drin
ist, weil er kompiliert ja dann die Dateien im Projektordner.
Und was passiert wenn ich in den Smartphone Projektordner einfach eine .class Datei irgendwo einfüge? Wenn ich mein Smartphone über USB an den Laptop anschließe
und über “run as…” das Programm starte, dann wird eine .apk Datei erstellt, wobei der Java Bytecode in einen Dalvik Bytecode kompiliert wird.

Also die Schwierigkeit liegt grad darin, dass ich nicht weiß wo genau ich die .class Datei in den beiden Projektordner ablegen muss.

Irgendwo und irgendwie kompilieren nutzt nichts. Das Package muss auch hier stimmen. Bedeutet das Verzeichnis in dem die java-Datei liegt muss dem Package entsprechen, das in der Datei oben bei package deklariert wird.
Am besten definierst Du in Eclipse ein eigenes Package, steckst Da deine Klasse(n) rein, kompilierst diese und und exportierst (ausschließlich dieses Package) als jar.
Dieses jar kannst Du dann via BuildPath in Deine normalen Java Projekte einbinden. Unter Android Projekten musst Du diese im libs Verzeichnis bereitstellen, damit sind diese Klassen auch in den Android Klassen importierbar/nutzbar und werden beim Export als Android App mit berücksichtigt.

Ich habe jetzt in Eclipse ein neues Projekt erstellt.
Den Projektordner habe ich MyLib genannt. Anschließend habe ich im src Ordner ein Package mit dem Namen com.shared erstellt.
In dieses Package habe ich die java Datei DataInfoPhaseOne.java abgelegt.
Danach habe ich mit der rechten Maustaste auf den Projektordner geklickt und Export… ausgewählt.
Im sich darauf öffnenen Dialogfenster Export… habe ich im Ordner Java den Eintrag JAR file ausgewählt und dann unten im Dialog auf Next gedrückt.
Daraufhin erschiend das Dialogfenster JAR Export (siehe Grafik). Ist das bis hierhin so richtig? Sind die Einstellungen in dem Dialog richtig gewählt?

package com.shared;   

import java.io.Serializable;

public class DataInfoPhaseOne implements Serializable
{
	private static final long serialVersionUID = 7109708812051889863L;
	private String dataType;
	private String sender;
	private String fileName;
	private boolean hideFile;
	//int dataSize
	
	public DataInfoPhaseOne(String dataType, String sender, String fileName, boolean hideFile)
	{
		this.dataType = dataType;
		this.sender = sender;
		this.fileName = fileName;
		this.hideFile = hideFile;
	}
	
	
	public String getDataType()
	{
		return this.dataType;
	}
	
	
	public String getSender()
	{
		return this.sender;
	}
	
	
	public String getFileName()
	{
		return this.fileName;
	}
	
	
	public boolean getHideFile()
	{
		return this.hideFile;
	}
}

Sieht soweit korrekt aus. Gibt es Probleme?

Das Exportieren als jar Datei hat funktioniert.

Ich habe jetzt mal probiert über writeObject ein Objekt der Klasse DataInfoPhaseOne vom Client an den Server zu senden, der es über readObject einliest und die Attribute auf der Konsole ausgibt. Zu Testzwecken sind der Server und der Client beides Java Programme die auf demselben PC laufen. Die Übertragung hat super funktioniert.

Nun wollte ich als Client aber meine App auf dem Smartphone verwenden die an den Server über writeObject ein Objekt der Klasse DataInfoPhaseOne verschickt.
Sobald ich jedoch den Smartphone Projekordner über die rechte Maustaste und run as… ausführen will, stürzt mir die App mit der Meldung ab:

10-10 16:31:47.344: E/AndroidRuntime(26226): FATAL EXCEPTION: main
10-10 16:31:47.344: E/AndroidRuntime(26226): java.lang.NoClassDefFoundError: com.shared.DataInfoPhaseOne
10-10 16:31:47.344: E/AndroidRuntime(26226): at com.master.DataClientThread.sendData(DataClientThread.java:94)
10-10 16:31:47.344: E/AndroidRuntime(26226): at com.master.PhaseOne.onActivityResult(PhaseOne.java:369)
10-10 16:31:47.344: E/AndroidRuntime(26226): at android.app.Activity.dispatchActivityResult(Activity.java:4649)
10-10 16:31:47.344: E/AndroidRuntime(26226): at android.app.ActivityThread.deliverResults(ActivityThread.java:3003)
10-10 16:31:47.344: E/AndroidRuntime(26226): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3050)
10-10 16:31:47.344: E/AndroidRuntime(26226): at android.app.ActivityThread.access$1100(ActivityThread.java:127)
10-10 16:31:47.344: E/AndroidRuntime(26226): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1188)
10-10 16:31:47.344: E/AndroidRuntime(26226): at android.os.Handler.dispatchMessage(Handler.java:99)
10-10 16:31:47.344: E/AndroidRuntime(26226): at android.os.Looper.loop(Looper.java:137)
10-10 16:31:47.344: E/AndroidRuntime(26226): at android.app.ActivityThread.main(ActivityThread.java:4448)
10-10 16:31:47.344: E/AndroidRuntime(26226): at java.lang.reflect.Method.invokeNative(Native Method)
10-10 16:31:47.344: E/AndroidRuntime(26226): at java.lang.reflect.Method.invoke(Method.java:511)
10-10 16:31:47.344: E/AndroidRuntime(26226): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
10-10 16:31:47.344: E/AndroidRuntime(26226): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
10-10 16:31:47.344: E/AndroidRuntime(26226): at dalvik.system.NativeStart.main(Native Method)

Ich habe meine Jar Datei welche die Klasse com.shared.DataInfoPhaseOne.class beinhaltet in den Ordner libs des Smarpthone Projektordner kopiert.
Daraufhin erschien im Android Dependencies Verzeichnis die Jar Datei ebenfalls.
Anschließend habe ich mit der rechten Maustaste auf die Jar Datei im libs Verzeichnis geklickt und Add to Build Path gedrückt.
Daraufhin wurde ein Referenced Libraries erstellt mit der Jar Datei. Insgesamt ist die Jar Datei nun also an drei Stellen zu sehen
(in libs, in Referenced Libraries und in Android Dependencies).
Danach habe ich mit der rechten Maustaste auf den Projektordner geklickt und Properties ausgewählt.
Dort bin ich auf den Reiter Order and Export gegangen und habe bei Android 4.2.2 und Android Dependencies und bei MyLib.jar ein
Häkchen gesetzt.Danach bin ich wieder mit der rechten Maustaste auf den Projektordner gegangen und habe auf Refresh gedrückt.
Der Highlight Editor von Eclipse zeigt keinen Fehler an und beschwert sich nicht über das Fehlen des Datentyps DataInfoPhaseOne,
also scheint die Anweisung import com.shared.DataInfoPhaseOne zu funktionieren.
Dennoch wird beim Ausführen des Programms auf dem Smartphone die NoClassDefFoundError Exception geworfen und die App stürzt ab.

So ganz steige ich da nicht durch. Die Aussagen passen irgendwie nicht zu einander oder ich verstehe was falsch.

Smartphone Projektordner = Android Projekt in Eclipse?
Die App schmiert bereits beim Ausführen in Eclipse ab? Und das sobald sie gestartet und noch bevor irgendein Objekt gesendet/empfangen wird?
Deiner Beschreibung nach sieht in Eclipse ja alles gut aus. Die externe jar wird als Lib erkannt und die darin enthaltene Klasse kann importiert werden. Mehr braucht es eigentlich nicht.

Genau, Smarpthone Projektordner = Android Projekt in Eclipse.

Okay hab das falsch gesagt. Wenn ich mit der rechten Maustaste auf das Android Projekt klicke und dann auf Run As gehe dann startet die App auf dem Smartphone erstmal
ohne Probleme.

In meiner App habe ich einen Button. Wenn der Button gedrückt wird, dann wird mir ein Objekt der Klasse DataInfoPhaseOne erstellt und über writeObject an den Server geschickt.
Zumindest in der Theorie. In der Praxis verhält es sich so, dass sobald ich den Button in meiner App klicke mir die App abstürzt und der Fehler java.lang.NoClassDefFoundError: com.shared.DataInfoPhaseOne ausgegeben wird.

Wird beim Buttonclick das DataInfoPhaseOne Objekt direkt per new Konstruktor erzeugt oder via Reflection?
Vermute mal ersteres, aber dann müsste Dir eigentlich bereits Eclipse einen Fehler melden und dürfte die Ausführung der App nie zulassen - merkwürdig das ganze… Du hast ja auch geschrieben, dass die Klasse com.shared.DataInfoPhaseOne in der Activity Klasse fehlerfrei importiert wird…

*** Edit ***

Hab mir Deinen oberen Post noch mal durch und etwas von BuildPath gelesen. Wo genau liegt jetzt die jar mit der Klasse?
Falls im Build Path lösche sie da wieder raus und sorge dafür, dass sie im libs Verzeichnis des Android Projektes liegt.

Ich habe mal das Problem in einem kleinen Projekt nachgestellt, so dass ihr es vielleicht auch auf euren Rechner testen könnt.

  1. Versuch:
    Ich habe ein kleines Server Programm namens MyDataInfoPhaseTestServer geschrieben.
    Ebenso Habe ich ein kleines Client Programm geschrieben namens MyDataInfoPhaseTestClient, das auf dem PC läuft.
    Ich öffne zwei Konsolenfenster. Auf dem ersten Konsolenfenster starte ich das Server Programm.
    Auf dem zweiten Konsolenfenster starte ich des Clientprogramm.
    Alles funktioniert wunderbar. Das Objekt der Klasse DataInfoPhaseOne wird vom Client an den Server übertragen.

  2. Versuch
    Ich habe wieder das Server Programm namens MyDataInfoPhaseTestServer.
    Nun verwende ich als Client aber mein Smartphone. Dazu habe ich das kleine Programm MyDataInfoPhaseTestApp geschrieben.
    Ich öffne ein Konsolenfenster. Dort starte ich das Server Programm.
    Anschließend installiere ich auf dem Smartphone die MyDataInfoPhaseTestApp App.
    Die App ist so aufgebaut, dass dort zwei Buttons zu sehen sind. Klicke ich auf den ersten Button so wird versucht eine Verbindung zum Server aufzubauen.
    Anschließend soll mit dem zweiten Button ein Objekt der Klasse DataInfoPhaseOne übertragen werden.

Nun passiert folgendes. Sobald ich auf den ersten Button klicke der die Verbindung zum Server herstellt wird mir auf der Logcat folgendes ausgegeben:

10-11 16:31:49.129: E/dalvikvm(891): Could not find class ‘com.shared.DataInfoPhaseOne’, referenced from method com.example.mydatainfophasetestapp.WorkerThreadSendData.send
10-11 16:31:49.129: W/dalvikvm(891): VFY: unable to resolve new-instance 472 (Lcom/shared/DataInfoPhaseOne;) in Lcom/example/mydatainfophasetestapp/WorkerThreadSendData;
10-11 16:31:49.129: D/dalvikvm(891): VFY: replacing opcode 0x22 at 0x0000
10-11 16:31:49.129: D/dalvikvm(891): DexOpt: unable to opt direct call 0x0d4d at 0x09 in Lcom/example/mydatainfophasetestapp/WorkerThreadSendData;.send

Klicke ich nun auf den zweiten Button um das Objekt der Klasse DataInfoPhaseOne zu übertragen stürzt mir die App ab und in der LogCat wird mir folgendes zusätzlich ausgegeben:

10-11 16:32:18.307: D/AndroidRuntime(891): Shutting down VM
10-11 16:32:18.307: W/dalvikvm(891): threadid=1: thread exiting with uncaught exception (group=0x40a96210)
10-11 16:32:18.338: E/AndroidRuntime(891): FATAL EXCEPTION: main
10-11 16:32:18.338: E/AndroidRuntime(891): java.lang.IllegalStateException: Could not execute method of the activity
10-11 16:32:18.338: E/AndroidRuntime(891): at android.view.View$1.onClick(View.java:3103)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.view.View.performClick(View.java:3574)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.view.View$PerformClick.run(View.java:14293)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.os.Handler.handleCallback(Handler.java:605)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.os.Handler.dispatchMessage(Handler.java:92)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.os.Looper.loop(Looper.java:137)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.app.ActivityThread.main(ActivityThread.java:4448)
10-11 16:32:18.338: E/AndroidRuntime(891): at java.lang.reflect.Method.invokeNative(Native Method)
10-11 16:32:18.338: E/AndroidRuntime(891): at java.lang.reflect.Method.invoke(Method.java:511)
10-11 16:32:18.338: E/AndroidRuntime(891): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
10-11 16:32:18.338: E/AndroidRuntime(891): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
10-11 16:32:18.338: E/AndroidRuntime(891): at dalvik.system.NativeStart.main(Native Method)
10-11 16:32:18.338: E/AndroidRuntime(891): Caused by: java.lang.reflect.InvocationTargetException
10-11 16:32:18.338: E/AndroidRuntime(891): at java.lang.reflect.Method.invokeNative(Native Method)
10-11 16:32:18.338: E/AndroidRuntime(891): at java.lang.reflect.Method.invoke(Method.java:511)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.view.View$1.onClick(View.java:3098)
10-11 16:32:18.338: E/AndroidRuntime(891): … 11 more
10-11 16:32:18.338: E/AndroidRuntime(891): Caused by: java.lang.NoClassDefFoundError: com.shared.DataInfoPhaseOne
10-11 16:32:18.338: E/AndroidRuntime(891): at com.example.mydatainfophasetestapp.WorkerThreadSendData.send(WorkerThreadSendData.java:61)
10-11 16:32:18.338: E/AndroidRuntime(891): at com.example.mydatainfophasetestapp.MainActivity.send(MainActivity.java:45)
10-11 16:32:18.338: E/AndroidRuntime(891): … 14 more

Zum Einbinden der MyLib.jar welches als Inhalt com/shared/DataInfoPhaseOne.class hat bin ich nun fogendermaßen vorgegangen.
Der Ordner libs exisitert bereits in jedem Android Projekt. Ich habe nun die MyLib.jar in den Ordner libs des Android Projektes kopiert.
Nachdem ich das getan habe erschien automatisch im Ordner Android Dependencies die MyLib.jar ein weiteres mal.
Die MyLib.jar ist also zweimal zu sehen (einmal in libs und einmal in Android Dependencies).
Danach bin ich mit der rechten Maustaste auf den Android Projektordner MyDataInfoTestApp gegangen, habe auf Properties gedrückt und bin
im sich öffnenden Dialog links auf JavaBuildPath gegangen. Dann habe ich den Reiter Order and Export ausgewählt und Häkchen bei Android 4.2.2 und
Android Dependencies gesetzt und mit OK bestätigt. Im Quellcode wird kein Fehler angezeigt.
Dann habe ich mit der rechten Maustaste auf den Android Ordner geklickt und mit Run As die App auf meinem Smarpthone installiert.
###############################################################################################################

MyDataInfoPhaseTestServer Java Projekt

public class MyMain
{
	public static void main(String[] args) 
	{
		new MyServer();
	}
}

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class MyServer 
{
	public MyServer()
	{
		ServerSocket server = null;
		
		try 
		{
			server = new ServerSocket(1024);
	        System.out.println("Server wurde gestartet!");
	        
	        while(true)
	        {
	        	Socket socket = server.accept();
	        	System.out.println("Smartphone verbunden");
	        	new WorkerReceiverThread(socket).start();
	        }
		}
		catch (IOException e) 
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				if(server != null)
					server.close();
			} 
			catch (IOException e) 
			{
				e.printStackTrace();
			}
		}
	}
}
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;

import com.shared.DataInfoPhaseOne;


public class WorkerReceiverThread extends Thread
{
	private Socket socket;
	private ObjectInputStream in;
	
	public WorkerReceiverThread(Socket socket)
	{
		this.socket = socket;
	}
	
	
	public void run()
	{
		try
		{
			this.in = new ObjectInputStream(this.socket.getInputStream());
			
			while(true)
			{
				Object receivedObject = this.in.readObject();
				if (receivedObject instanceof DataInfoPhaseOne)
				{
					System.out.println("Ein DataInfoPhaseOne Objekt ist angekommen");
					DataInfoPhaseOne dataInfoPhaseOne = (DataInfoPhaseOne) receivedObject;
					System.out.println("dataType: " + dataInfoPhaseOne.getDataType());
					System.out.println("fileName: " + dataInfoPhaseOne.getFileName());
					System.out.println("sender: " + dataInfoPhaseOne.getSender());
					System.out.println("hideFile: " + dataInfoPhaseOne.getHideFile());
				}
				else
				{
					System.out.println("das war kein DataInfoPhaseOne Objekt");
				}
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		} 
		catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				this.in.close();
			} 
			catch (IOException e) 
			{
				e.printStackTrace();
			}
		}
	}
}

##############################################################################################################

MyDataInfoPhaseTestApp Android Projekt

package com.example.mydatainfophasetestapp;


import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity
{
	private WorkerThreadSendData wt = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	
	public void connect(View view)
	{
		if(wt == null)
		{
			String ip = "192.168.178.29"; 
			int port = 1024; 
			this.wt = new WorkerThreadSendData(ip, port, this);
			this.wt.start();
		}
	}
	
	
	public void send(View view)
	{
		if(wt != null)
			this.wt.send();
	}
}

package com.example.mydatainfophasetestapp;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;

import com.shared.DataInfoPhaseOne;

public class WorkerThreadSendData extends Thread
{
	private String ip;
	private int port;
	private ObjectOutputStream out;
	private Activity activity;
	
	public WorkerThreadSendData(String ip, int port, Activity activity)
	{
		this.ip = ip;
		this.port = port;
		this.activity = activity;
	}
	
	
	public void run()
	{
		try
		{
			Socket socket = new Socket(ip, port);
			this.out = new ObjectOutputStream(socket.getOutputStream());	
	
			/*this.activity.runOnUiThread(new Runnable() {

                @Override
                public void run() 
                {
        			TextView textView1 = (TextView)activity.findViewById(R.id.textView1);
        			textView1.setText("Connected");
                }
            });*/
		}
		catch (UnknownHostException e)
		{
			e.printStackTrace();
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}
	
	
	public void send()
	{
		DataInfoPhaseOne dipo = new DataInfoPhaseOne("a", "b", "c", true);
		
		try 
		{
			this.out.writeObject(dipo);
			this.out.flush();
		}
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}
}

[XML]

<?xml version="1.0" encoding="utf-8"?>
<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="17" />

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

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.mydatainfophasetestapp.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
[/XML]

10-11 16:31:49.129: E/dalvikvm(891): Could not find class ‘com.shared.DataInfoPhaseOne’, referenced from method com.example.mydatainfophasetestapp.WorkerThreadSendData.send
10-11 16:31:49.129: W/dalvikvm(891): VFY: unable to resolve new-instance 472 (Lcom/shared/DataInfoPhaseOne;) in Lcom/example/mydatainfophasetestapp/WorkerThreadSendData;
10-11 16:31:49.129: D/dalvikvm(891): VFY: replacing opcode 0x22 at 0x0000
10-11 16:31:49.129: D/dalvikvm(891): DexOpt: unable to opt direct call 0x0d4d at 0x09 in Lcom/example/mydatainfophasetestapp/WorkerThreadSendData;.send
10-11 16:32:18.307: D/AndroidRuntime(891): Shutting down VM
10-11 16:32:18.307: W/dalvikvm(891): threadid=1: thread exiting with uncaught exception (group=0x40a96210)
10-11 16:32:18.338: E/AndroidRuntime(891): FATAL EXCEPTION: main
10-11 16:32:18.338: E/AndroidRuntime(891): java.lang.IllegalStateException: Could not execute method of the activity
10-11 16:32:18.338: E/AndroidRuntime(891): at android.view.View$1.onClick(View.java:3103)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.view.View.performClick(View.java:3574)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.view.View$PerformClick.run(View.java:14293)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.os.Handler.handleCallback(Handler.java:605)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.os.Handler.dispatchMessage(Handler.java:92)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.os.Looper.loop(Looper.java:137)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.app.ActivityThread.main(ActivityThread.java:4448)
10-11 16:32:18.338: E/AndroidRuntime(891): at java.lang.reflect.Method.invokeNative(Native Method)
10-11 16:32:18.338: E/AndroidRuntime(891): at java.lang.reflect.Method.invoke(Method.java:511)
10-11 16:32:18.338: E/AndroidRuntime(891): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
10-11 16:32:18.338: E/AndroidRuntime(891): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
10-11 16:32:18.338: E/AndroidRuntime(891): at dalvik.system.NativeStart.main(Native Method)
10-11 16:32:18.338: E/AndroidRuntime(891): Caused by: java.lang.reflect.InvocationTargetException
10-11 16:32:18.338: E/AndroidRuntime(891): at java.lang.reflect.Method.invokeNative(Native Method)
10-11 16:32:18.338: E/AndroidRuntime(891): at java.lang.reflect.Method.invoke(Method.java:511)
10-11 16:32:18.338: E/AndroidRuntime(891): at android.view.View$1.onClick(View.java:3098)
10-11 16:32:18.338: E/AndroidRuntime(891): … 11 more
10-11 16:32:18.338: E/AndroidRuntime(891): Caused by: java.lang.NoClassDefFoundError: com.shared.DataInfoPhaseOne
10-11 16:32:18.338: E/AndroidRuntime(891): at com.example.mydatainfophasetestapp.WorkerThreadSendData.send(WorkerThreadSendData.java:61)
10-11 16:32:18.338: E/AndroidRuntime(891): at com.example.mydatainfophasetestapp.MainActivity.send(MainActivity.java:45)
10-11 16:32:18.338: E/AndroidRuntime(891): … 14 more

###############################################################################################################

MyDataInfoPhaseTestPC

public class MyMain
{
	public static void main(String[] args)
	{
		new MyClient();
	}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import com.shared.DataInfoPhaseOne;


public class MyClient 
{
	private ObjectOutputStream out;
	
	public MyClient()
	{
		String ip = "192.168.178.29"; 
		int port = 1024; 
		
		Socket socket = null;
		
		try
		{
			socket = new Socket(ip, port);
			this.out = new ObjectOutputStream(socket.getOutputStream());
			System.out.println("Client verbunden");
			
			System.out.println("DataInfoPhaseOne Objekt versenden? (j/n)");
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			String s;
		    
			do
		    {
			    s = in.readLine();
			    
			    if(s.equals("j"))
			    	this.send();
			    
		    }while(!s.equals("n"));  
		}
		catch (UnknownHostException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(socket != null)
			{
				try
				{
					socket.close();
				}
				catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}
	}
	
	
	public void send()
	{
		DataInfoPhaseOne dipo = new DataInfoPhaseOne("a", "b", "c", true);
		
		try 
		{
			this.out.writeObject(dipo);
			this.out.flush();
		}
		catch (IOException e) 
		{
			e.printStackTrace();
		}
		
		System.out.println("DataInfoPhaseOne Objekt an Server gesendet");
	}
}

###############################################################################################################

Die Klasse com.shared.DataInfoPhaseOne

package com.shared;   

import java.io.Serializable;

public class DataInfoPhaseOne implements Serializable
{
	private static final long serialVersionUID = 7109708812051889863L;
	private String dataType;
	private String sender;
	private String fileName;
	private boolean hideFile;
	//int dataSize
	
	public DataInfoPhaseOne(String dataType, String sender, String fileName, boolean hideFile)
	{
		this.dataType = dataType;
		this.sender = sender;
		this.fileName = fileName;
		this.hideFile = hideFile;
	}
	
	
	public String getDataType()
	{
		return this.dataType;
	}
	
	
	public String getSender()
	{
		return this.sender;
	}
	
	
	public String getFileName()
	{
		return this.fileName;
	}
	
	
	public boolean getHideFile()
	{
		return this.hideFile;
	}
}

Äehm… ich dachte bis eben auch, dass das alles so hinkommen müsste… dann fiel mir auf, dass “DataInfoPhaseOne” gar keinen öffentlichen Standardkonstruktor definiert. Ein solcher wird nämlich vom ObjectInputStream für die Deserialisierung benötigt, damit sie leer initialisiert werden kann (vgl. “unable to resolve new-instance 472 (Lcom/shared/DataInfoPhaseOne;” ).

Ich habe der Klasse DataInfoPhaseOne nun einen Standarkonstruktor dazugegeben.
Ich habe in Eclipse ein Java Project erstellt namens MyLib.
Dort habe ich ein Package namen com.shared erstellt.
Darin befindet sich die Klasse DataInfoPhaseOne inklusive Standardkonstruktor.
Anschließend bin ich mit der Rechten Maustaste auf den Projektordner gegangen und habe
auf Export… gedrückt. Danach hat sich ein Dialog namens Export geöffnet.
Da habe ich JAR file ausgewählt und bin auf Next gegangen. Im darauffolgenden Dialog
JAR Export habe ich die Häkchen bei .classpath und .project weggemacht und habe auf finish gedrückt.
Danach habe ich die MyLib.jar genommen und wie bereits oben beschrieben eingebunden.
Trotz des Standardkonstrekturs tritt der Fehler bei der Android App weiterhin auf, während
es mit dem ClientProgramm auf dem PC wunderbar funktioniert.

package com.shared;   

import java.io.Serializable;

public class DataInfoPhaseOne implements Serializable
{
	private static final long serialVersionUID = 7109708812051889863L;
	private String dataType;
	private String sender;
	private String fileName;
	private boolean hideFile;
	//int dataSize
	
	public DataInfoPhaseOne()
	{
		
	}
	
	
	public DataInfoPhaseOne(String dataType, String sender, String fileName, boolean hideFile)
	{
		this.dataType = dataType;
		this.sender = sender;
		this.fileName = fileName;
		this.hideFile = hideFile;
	}
	
	
	public String getDataType()
	{
		return this.dataType;
	}
	
	
	public String getSender()
	{
		return this.sender;
	}
	
	
	public String getFileName()
	{
		return this.fileName;
	}
	
	
	public boolean getHideFile()
	{
		return this.hideFile;
	}
}

Welche Jar verwendest du denn nun im smartphone-Projekt? Eine, die für Java1.7 (funktioniert nicht) oder eine die für Android (sollte funktionieren) kompiliert wurde? Dalvik- und Oracle-Bytecode sind erstens nicht kompatibel und 2. hängt Dalvik noch bei JVM-Level 1.6 rum.

Ich verwende sowohl für das Serverprogramm als auch für die Android App ein und dieselbe jar Datei.

Die jar Datei die ich verwende habe ich wie oben beschrieben erstellt.
Ich habe zunächst in Eclipse ein neues Java Projekt erstellt, dort das Package com.shared erstellt
und darin die Klasse DataInfoPhaseOne erstellt.
Dann habe ich mit der rechten Maustaste auf den Projektordner geklickt und auf Export… geklickt.
Im Export Dialog habe ich im Ordner Java auf JAR file geklickt. Dann auf Next gedrückt
und im JAR Export Dialog die Häkchen bei .classpath und .project weggemacht und finish geklickt.

Ich habe das jdk1.7.0_21 und jre7 installiert.
Beim Java Projekt habe ich also JavaSE-1.7 verwendet.

Wie erstellte ich denn eine Jar Datei für Android?

Mit dem Android SDK…
Ich weis aber nicht, ob es da noch was für Eclipse gibt. Wie erstellst du denn die Android-App? Füge in dieses Projekt nochmal die Quelltexte der Jar ein ohne die Paketnamen zu ändern (das ist wichtig).

So ich habs jetzte hinbekommen, habe die Klasse für 1.6 kompiliert. Danke für die Beiträge.