android - Eclipse:Android 项目中 JDK 类的 java.lang.NoClassDefFoundError

标签 android eclipse adt noclassdeffounderror

首先,我想提一下,我阅读了许多 stackoverflow 上关于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 自动添加必要的导入:

import java.awt.image.BufferedImage;

但要求我为此类添加 jars/JRE。

我在“已安装的 JRE”( like they instruct on the Eclipse help pages) 中将 jdk1.6.0_38 添加到 Eclipse。

在项目的“Java 构建路径”中,我通过“添加库”->“JRE 系统库”->“工作区默认 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)

以下是我尝试过但不起作用的方法:

  1. 将 jdk 的位置添加到“eclipse.ini”(“-vm /usr/lib/jvm/jdk1.6.0_38/bin”,分两行)。
  2. 我添加了路径“-Djava.library.path=/usr/lib/jvm/jdk1.6.0_38/jre/lib”的“默认 VM 参数”。
  3. 使用 32 位 JRE 和 JDK 以及 JRE/JDK7 - 没有用(当然)。
  4. 我尝试将 jdk jar 文件手动添加到“libs”文件夹并标记“添加到构建路径”- 没有用。
  5. 我使用 ADT 和 Android SDK 卸载并重新安装了 Eclipse...

没有什么可以修复这个烦人的错误...

请注意这些:

  1. 我确保我的 .classpath 文件包含默认的 JRE 条目 ( like they say here )
  2. 我尝试将其他 jar 文件添加到“libs”文件夹+“添加到路径”,并使用它们 - 它工作正常。
  3. 我尝试使用“import java.awt.image.BufferedImage;”运行相同的代码(一行)在常规 java 项目(不是 android 项目)中并使项目“使用默认 JRE”- 它工作正常!为什么在常规 Java 项目而不是 Android 项目中工作?

我想这意味着我的 Eclipse 安装确实能够使用 jdk 类,但不能在 android 应用程序中

那么我需要做什么才能让这一行代码在 android 应用程序中运行?

如有任何帮助,我们将不胜感激。提前致谢。

最佳答案

So what do I have to do to make this single line of code run in an android application?

简短的回答是:没什么,因为您不能对此做任何事情。整个 java.awt.* 框架不是 Android SDK 的一部分,包括 BufferedImage,因此不受模拟器或物理设备的支持。 Android 有自己的加载和渲染图形的实现。

在不知道您需要 BufferedImage 做什么的情况下,很难说您应该考虑什么替代方案。您很可能正在尝试进行某种图像处理,涉及访问图像的各个像素?如果是这样,请查看 BitmapBitmapFactory类。

这一切都归结为 Java SDK != Android SDK。无论如何,也可以考虑在 SO 上进行搜索;你不是第一个犯这个错误的人。

关于android - Eclipse:Android 项目中 JDK 类的 java.lang.NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14132532/

相关文章:

c - 是否可以使用泛型而不是仅使用整数在 C 中实现 StackADT?

java - getGlobalVisibleRect() 究竟是什么?

android - 如何在 notifyChange 后更改 Loader<Cursor> 中的查询

eclipse - Ubuntu中的Eclipse插件问题

c - 如何在 eclipse 中重命名(重构)c 宏

android - 无法安装 ADT。缺少 org.eclipse.wst.xml.ui

Android TCP 快速启动配置

android - 共享 apklib 文件但隐藏源代码可能吗?

java - Eclipse 是否适用于 El Capitan?

java - 无法从 Eclipse、ADT 22.6 创建或编辑 Android 虚拟设备 (AVD)