Networking - ExceptionInInitializerError

Dear all!



I am trying to use client - server communication on android and I get the following ExceptionInInitializerError.

The code runs fine on desktop.



Logcat:



I/Serializer(23950): INFO Serializer 3:22:32 PM Registered class[-24]:class java.util.ArrayList to:com.jme3.network.serializing.serializers.CollectionSerializer@2afeed48

W/dalvikvm(23950): Exception Ljava/lang/NoClassDefFoundError; thrown while initializing Lcom/jme3/network/serializing/Serializer;

I/Serializer(23950): INFO Serializer 3:22:32 PM Registered class[-24]:class java.util.ArrayList to:com.jme3.network.serializing.serializers.CollectionSerializer@2afeed48

W/dalvikvm(23950): Exception Ljava/lang/NoClassDefFoundError; thrown while initializing Lcom/jme3/network/serializing/Serializer;



E/dalvikvm(23950): Could not find class ‘java.beans.beancontext.BeanContextServicesSupport’, referenced from method com.jme3.network.serializing.Serializer.

W/dalvikvm(23950): VFY: unable to resolve const-class 1542 (Ljava/beans/beancontext/BeanContextServicesSupport;) in Lcom/jme3/network/serializing/Serializer;

E/dalvikvm(23950): Could not find class ‘java.beans.beancontext.BeanContextServicesSupport’, referenced from method com.jme3.network.serializing.Serializer.

W/dalvikvm(23950): VFY: unable to resolve const-class 1542 (Ljava/beans/beancontext/BeanContextServicesSupport;) in Lcom/jme3/network/serializing/Serializer;



E/AndroidHarness(23950): Exception thrown in Thread[GLThread 9,5,main]

E/AndroidHarness(23950): java.lang.ExceptionInInitializerError

E/AndroidHarness(23950): at com.jme3.network.base.MessageProtocol.messageToBuffer(MessageProtocol.java:74)

E/AndroidHarness(23950): at com.jme3.network.base.DefaultClient.send(DefaultClient.java:238)

E/AndroidHarness(23950): at com.jme3.network.base.DefaultClient.start(DefaultClient.java:159)

E/AndroidHarness(23950): at com.jme3.monkeyzone.ClientNetManager.connect(ClientNetManager.java:53)

E/AndroidHarness(23950): at com.jme3.monkeyzone.ClientNetManager.initialize(ClientNetManager.java:47)

E/AndroidHarness(23950): at com.jme3.app.state.AppStateManager.initializePending(AppStateManager.java:219)

E/AndroidHarness(23950): at com.jme3.app.state.AppStateManager.update(AppStateManager.java:249)

E/AndroidHarness(23950): at com.jme3.app.SimpleApplication.update(SimpleApplication.java:238)

E/AndroidHarness(23950): at com.jme3.app.AndroidHarness.update(AndroidHarness.java:411)

E/AndroidHarness(23950): at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:309)

E/AndroidHarness(23950): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1363)

E/AndroidHarness(23950): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)

E/AndroidHarness(23950): Caused by: java.lang.NoClassDefFoundError: java.beans.beancontext.BeanContextServicesSupport

E/AndroidHarness(23950): at com.jme3.network.serializing.Serializer.(Serializer.java:128)



Is the problem with the serialization or something else?



Thank you!

Looks like SpiderMonkey will not work on android because it doesn’t have the Java beans stuff:

java.lang.NoClassDefFoundError: java.beans.beancontext.BeanContextServicesSupport



I don’t know if that is fixable or not.

Hmm, that’s odd. Why is serialization enabled for those java beans?



@Paul: Do you know anything about this? Why do we need to serialize these BeanContext classes?

@Momoko_Fan said:
Hmm, that's odd. Why is serialization enabled for those java beans?

@Paul: Do you know anything about this? Why do we need to serialize these BeanContext classes?


Ah, good question. I first thought SM was trying to use these classes to determine bean fields or something.

Serializer has always included some questionable classes. There is no good reason for these to be included by default.

I will look at stubbing them out. Removing them completely will break the version detection for other apps (like mine). (Have I mentioned how much I dislike how this is setup before?) I vowed to fix that the next time I had to mess with this list.

If the OP doesn't mind compiling his own then he can just remove those lines.

This much should now be fixed in SVN.

1 Like

Thank for the support!!



I’ve rebuild JME3 and that part seems to be fixed now.



However got the following exception:



W/dalvikvm( 8548): threadid=8: thread exiting with uncaught exception (group=0x2aac4560)

E/AndroidHarness( 8548): Exception thrown in Thread[GLThread 9,5,main]

E/AndroidHarness( 8548): java.lang.IllegalArgumentException: Class has not been registered:class com.jme3.andcar.messages.NewPlayerMessage

E/AndroidHarness( 8548): at com.jme3.network.serializing.Serializer.getSerializerRegistration(Serializer.java:327)

E/AndroidHarness( 8548): at com.jme3.network.serializing.Serializer.getSerializerRegistration(Serializer.java:296)

E/AndroidHarness( 8548): at com.jme3.network.serializing.Serializer.writeClass(Serializer.java:371)

E/AndroidHarness( 8548): at com.jme3.network.serializing.Serializer.writeClassAndObject(Serializer.java:391)

E/AndroidHarness( 8548): at com.jme3.network.base.MessageProtocol.messageToBuffer(MessageProtocol.java:74)

E/AndroidHarness( 8548): at com.jme3.network.base.DefaultClient.send(DefaultClient.java:238)

E/AndroidHarness( 8548): at com.jme3.network.base.DefaultClient.send(DefaultClient.java:208)

E/AndroidHarness( 8548): at com.jme3.andcar.ClientNetManager.sendMessage(ClientNetManager.java:60)

E/AndroidHarness( 8548): at com.jme3.andcar.NiftyGui.initialize(NiftyGui.java:16)

E/AndroidHarness( 8548): at com.jme3.app.state.AppStateManager.initializePending(AppStateManager.java:219)

E/AndroidHarness( 8548): at com.jme3.app.state.AppStateManager.update(AppStateManager.java:249)

E/AndroidHarness( 8548): at com.jme3.app.SimpleApplication.update(SimpleApplication.java:238)

E/AndroidHarness( 8548): at com.jme3.app.AndroidHarness.update(AndroidHarness.java:411)

E/AndroidHarness( 8548): at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:309)

E/AndroidHarness( 8548): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1363)

E/AndroidHarness( 8548): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)

W/dalvikvm( 8548): threadid=8: thread exiting with uncaught exception (group=0x2aac4560)



NewPlayerMessage Class:



package com.jme3.andcar.messages;



import com.jme3.andcar.ClientGameManager;

import com.jme3.andcar.Globals;

import com.jme3.network.serializing.Serializable;



@Serializable()

public class NewPlayerMessage extends SyncMessage {



private String name = Globals.MYNAME;



public NewPlayerMessage(){

}



public NewPlayerMessage(String name) {

this.name = name;

}



public String getName(){

return name;

}



@Override

public void applyMessage() {

ClientGameManager.getInstance().addNewPlayer(this);

}

}



I was wondering whether am I the very first wants to use the JME3’s Networking API on Android?



Thanks

NagPer

You have to register the messages you want to use, the issue is rather that you use this library for the first time ^^

:slight_smile:

Of course I have registered them!





Serializer.registerClass(NewPlayerMessage.class);



@Serializable()

public class NewPlayerMessage extends SyncMessage {





Moreover it works perfectly in desktop environment.





Thanks for any suggestions

NagPer

Although I cant find any log entries whether it has been successfully registered or not, so I suppose for some reason that part of the code where i do the registration did’t run.



I call the registration this way:



public class ClientMain extends SimpleApplication {

public static void main(String[] args) {



Init.regMessages();



}







public class Init {



public static void regMessages() {

Serializer.registerClass(ManualControlMessage.class);

Serializer.registerClass(StartGameMessage.class);

Serializer.registerClass(NewPlayerMessage.class);

Serializer.registerClass(ReadyPlayerMessage.class);

Serializer.registerClass(SyncMessage.class);

Serializer.registerClass(LocationControlMessage.class);

}

I think main() is not called for android apps. You should be initializing your messages in simpleInit().

@pspeed said:
I think main() is not called for android apps.

yep, correct
1 Like

Thanks! It works!