Eclipse:Android 项目中 JDK 类的 java.lang.NoClassDefFoundError
Posted
技术标签:
【中文标题】Eclipse:Android 项目中 JDK 类的 java.lang.NoClassDefFoundError【英文标题】:Eclipse: java.lang.NoClassDefFoundError for JDK classes in an Android project 【发布时间】:2012-12-17 10:32:01 【问题描述】:首先,我想提一下,我阅读了 许多 关于 NoClassDefFoundError 的 *** 帖子,我还在 许多 其他博客和网站,但人们提供的解决方案并没有解决它。
我在 Ubuntu 12.10 64 位 上使用 ADT 插件版本 v21.0.1-543035 运行 Eclipse 64 位。一切都是 64 位的,Ubuntu、Eclipse 以及我使用的 JRE 和 JDK (jdk1.6.0_38)。
我编写了一个非常小的 android 应用程序,需要 JDK 中的一个类才能运行。
我稍微隔离了这个问题,并通过创建一个新的“Android 应用程序项目”来重新创建它,我的代码只有一行(在 onCreate 方法的主类中)。这一行:
BufferedImage buff = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
Eclipse 自动添加必要的导入:
导入 java.awt.image.BufferedImage;
但要求我为此类添加 jars/JRE。
我在“已安装的 JRE”(like they instruct on the Eclipse help pages) 中将 jdk1.6.0_38 添加到 Eclipse。
在项目的“Java Build Path”中我是通过“添加库”->“JRE系统库”->“Workspace默认JRE”添加的。它会自动将 JDK 添加到项目的构建路径中。
在编译期间,我没有收到任何错误。只有在 android 模拟器(任何 AVD)中运行应用程序时,我才会收到以下错误:
E/dalvikvm(828): Could not find class 'java.awt.image.BufferedImage', referenced from method com.example.usejdk.MainActivity.onCreate
W/dalvikvm(828): VFY: unable to resolve new-instance 467 (Ljava/awt/image/BufferedImage;) in Lcom/example/usejdk/MainActivity;
D/dalvikvm(828): VFY: replacing opcode 0x22 at 0x0009
D/dalvikvm(828): DexOpt: unable to opt direct call 0x0cdc at 0x0c in Lcom/example/usejdk/MainActivity;.onCreate
D/AndroidRuntime(828): Shutting down VM
W/dalvikvm(828): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
E/AndroidRuntime(828): FATAL EXCEPTION: main
E/AndroidRuntime(828): java.lang.NoClassDefFoundError: java.awt.image.BufferedImage
E/AndroidRuntime(828): at com.example.usejdk.MainActivity.onCreate(MainActivity.java:16)
E/AndroidRuntime(828): at android.app.Activity.performCreate(Activity.java:5104)
E/AndroidRuntime(828): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
E/AndroidRuntime(828): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
E/AndroidRuntime(828): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
E/AndroidRuntime(828): at android.app.ActivityThread.access$600(ActivityThread.java:141)
E/AndroidRuntime(828): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
E/AndroidRuntime(828): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(828): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(828): at android.app.ActivityThread.main(ActivityThread.java:5039)
E/AndroidRuntime(828): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(828): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(828): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime(828): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime(828): at dalvik.system.NativeStart.main(Native Method)
以下是我尝试过不起作用的方法:
-
向“eclipse.ini”添加 jdk 的位置(“-vm
/usr/lib/jvm/jdk1.6.0_38/bin" 分两行)。
我添加了路径“-Djava.library.path=/usr/lib/jvm/jdk1.6.0_38/jre/lib”的“默认 VM 参数”。
使用 32 位 JRE 和 JDK 以及 JRE/JDK7 - 不起作用(当然)。
我尝试将 jdk jar 文件手动添加到“libs”文件夹并标记“添加到 buildpath” - 没有用。
我使用 ADT 和 Android SDK 再次卸载并安装了 Eclipse...
没有什么能解决这个烦人的错误...
请同时注意以下几点:
-
我确保我的 .classpath 文件包含默认 JRE 条目 (like they say here)
我尝试将 其他 jar 文件添加到“libs”文件夹 +“添加到路径”中,并使用它们 - 效果很好。
我尝试使用“import java.awt.image.BufferedImage;”运行相同的代码(一行)在 常规 java 项目(不是 android 项目)中并让项目“使用默认 JRE” - 它运行良好! 为什么会这样从事常规 Java 项目而不是 Android 项目?
我猜这意味着我的 Eclipse 安装确实能够使用 jdk 类,但不能在 android 应用程序中。
那么我需要做什么才能让这行代码在Android 应用程序中运行?
非常感谢任何帮助。提前谢谢。
【问题讨论】:
哇。对于一个非常简单的答案,这是一个写得很好的问题:(。 【参考方案1】:那么我必须做些什么才能让这行代码在安卓应用程序中运行呢?
简短的回答是:没什么,因为你不能对此做任何事情。整个java.awt.*
框架不是Android SDK 的一部分,包括BufferedImage
,因此不受模拟器或物理设备的支持。 Android 有自己的加载和渲染图形实现。
在不知道您需要 BufferedImage
的情况下,很难说您应该考虑什么替代方案。您很可能正在尝试进行某种图像处理,包括访问图像的各个像素?如果是这种情况,请查看 Bitmap
和 BitmapFactory
类。
这一切都归结为Java SDK != Android SDK
。无论如何,也可以考虑在 SO 上进行搜索;你不是第一个犯这个错误的人。
【讨论】:
感谢您提供这个令人沮丧但很有帮助的答案。 :) 所以 Eclipse 不能告诉我们,当使用 ADT 创建 Android 应用程序时,将 JRE 或 JDK 作为资源导入将不起作用?此外,Eclipse 在其菜单中提供了在 Android 应用程序中“使用默认 JRE”的选项,但根据您的回答,这个选项永远不会起作用? 我想不存在使用特定的“Android 应用程序中的 JRE”这样的事情。 Google 创建了自己的运行时环境 (Dalvik),它不同于标准 JVM,尽管在某些方面“兼容”。因此,Android 主要基于 Java 作为一种编程语言(语法),但并未采用整个平台及其所有功能。如果您有兴趣,here 和 here 的轮廓还有一些差异。 我明白了。有趣的。感谢链接。我也会向任何对该主题感兴趣的人推荐,阅读***中有关 Dalvik 的内容。那么,如果我要向 Eclipse 开发人员致辞并要求在 在 Android 项目中编码时删除“使用默认 JRE”选项,这是否正确? (它可以为许多新手节省很多时间来解决这个问题。我花了 3 周时间......真可惜......) 嗯,你写的 Java 代码在优化成 dex 格式之前仍然需要编译成字节码。从这个编译的角度来看,能够选择是否要使用例如可能是有意义的。javac
的 1.5、1.6 或 1.7 版。然而,runtime environment(JRE 真正代表的)版本在 Android 的上下文中是毫无意义的,因为它有自己的运行时环境。 Eclipse 开发人员可能不会为此烦恼,但您可以尝试与 ADT 开发人员联系以提出可能的改进建议。以上是关于Eclipse:Android 项目中 JDK 类的 java.lang.NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse 中 JDK 1.7 的 Facebook SDK 4.x 错误
Eclipse Package Explorer 不显示新 Android 项目中的所有文件