首先,我想提一下我读过manystackoverflow 帖子关于没有发现类定义错误,我也在many其他博客和网站,但人们提供的解决方案并没有解决这个问题。
我在跑步Eclipse 64 位使用 ADT 插件版本 v21.0.1-543035Ubuntu 12.10 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。
我将 jdk1.6.0_38 添加到 Eclipse 的“Installed JREs”(就像 Eclipse 帮助页面上的指示一样 http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.user/tasks/task-add_new_jre.htm).
在项目的“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)
这是我尝试过的事情没用:
- 添加到“eclipse.ini" jdk 的位置 ("-vm
/usr/lib/jvm/jdk1.6.0_38/bin”在 2 个单独的行中)。
- 我添加了路径“-Djava.library.path=/usr/lib/jvm/jdk1.6.0_38/jre/lib”的“默认VM参数”。
- 使用 32 位 JRE 和 JDK 以及 JRE/JDK 7 - 不起作用(当然)。
- 我尝试添加jdk jar文件manually到“libs”文件夹并标记“添加到构建路径” - 不起作用。
- 我卸载并使用 ADT 和 Android SDK 再次安装 Eclipse...
没有什么可以解决这个恼人的错误......
请同时注意这些:
- 我确定我的.classpath文件包含默认的 JRE 条目(就像他们在这里说的 http://maven.apache.org/plugins/maven-eclipse-plugin/trouble-shooting/jdk-being-used-is-different-than-expected.html)
- 我尝试添加otherjar 文件到“libs”文件夹+“添加到路径”,并使用它们 - 它工作得很好。
- 我尝试使用“import java.awt.image.BufferedImage;”运行相同的代码(一行)在一个regularjava项目(不是安卓项目)并使项目“使用默认 JRE” - 并且它工作得很好!为什么它适用于常规 Java 项目而不适用于 Android 项目?
我想这意味着我的 Eclipse 安装does有能力使用jdk类,但是不在 Android 应用程序中.
那么我需要做什么才能让这一行代码运行在 Android 应用程序中?
任何帮助将非常非常感激。提前致谢。