Ich habe mal das Problem in einem kleinen Projekt nachgestellt, so dass ihr es vielleicht auch auf euren Rechner testen könnt.
-
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.
-
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;
}
}