I now have a work-around for the issue I described here, whereby <ClsName>.class expressions will not compile when writing JAVA Midlets that target CLDC 1.0.
The problem is that “code generated for the class literal syntax requires certain platform
classes to be present”.
As mentioned before, these classes are available to CLDC 1.1, so a possible workaround is to target the later CLDC version. Unfortunately, this means that your application will only work on recent devices that support the updates spec.
Fortunately, there is a very simple solution to the problem. It is quite possible to reproduce the missing classes and compile them into your application. If you do so, your application will compile quite happily. The classes required are “java.lang.NoClassDefFoundError” and its parent class, “java.lang.LinkageError”. Thankfully, these classes are both very simple, and can be reproduced easily.
Better still, a reference version of these classes is available under the GNU licence, so you can simply include these versions and away you go.
For easy reference, here are copies of the two classes that I found here and here:
/* NoClassDefFoundError.java -- thrown when a ClassLoader cannot find a class Copyright (C) 1998, 1999, 2001, 2002, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Classpath; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package java.lang; /** * A <code>NoClassDefFoundError</code> is thrown when a classloader or the * Java Virtual Machine tries to load a class and no definition of the class * can be found. This could happen when using the <code>new</code> expression * or during a normal method call. The reason this would occur at runtime is * because the missing class definition existed when the currently executing * class was compiled, but now that definition cannot be found. * * @author Brian Jones * @author Tom Tromey (tromey@cygnus.com) * @status updated to 1.4 */ public class NoClassDefFoundError extends LinkageError { /** * Compatible with JDK 1.0+. */ private static final long serialVersionUID = 9095859863287012458L; /** * Create an error without a message. */ public NoClassDefFoundError() { } /** * Create an error with a message. * * @param s the message */ public NoClassDefFoundError(String s) { super(s); } }
/* LinkageError.java -- thrown when classes valid at separate compile times cannot be linked to each other Copyright (C) 1998, 1999, 2001, 2002, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Classpath; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package java.lang; /** * Subclasses of <code>LinkageError</code> are thrown to indicate that two * classes which were compatible at separate compilation times cannot be * linked to one another. * * @author Brian Jones * @author Tom Tromey (<a href="mailto:tromey@cygnus.com">tromey@cygnus.com</a>) * @status updated to 1.4 */ public class LinkageError extends Error { /** * Compatible with JDK 1.0+. */ private static final long serialVersionUID = 3579600108157160122L; /** * Create an error without a message. */ public LinkageError() { } /** * Create an error with a message. * * @param s the message */ public LinkageError(String s) { super(s); } }
It seems to work well, thank you !
Refacto:
I am delighted!
I make a application for mobile that works with a service web….works fine from emulator….but when I try from a phone show me “java.lang.noclassdeffounderror”
I don´t get how use the code that you post…
Jose:
It sounds like there is a class available on the emulator that doesn’t exist on your phone. If that is the case, this code won’t help. Sorry.
Yeah, was the phone…I was work with a HTC TyTN2..and no works then I try in a Nokia and works…I think that is for Windows mobile…then like I need work over this platform, we decide change to C#…anyway Thank you for you answer.:)
Dear sir,
i am using nokia mobile c3 but when i am tring to open uc browser, the below error showing. pls sugess
me.
“Class not found Java/lang/classNotFoudnException/uc/
application/app/webClient”
thanks & regards