まず、私はNoClassDefFoundErrorに関する多くのstackoverflow の投稿を読み、他の多くのブログや Web サイトでも読みましたが、人々が提供した解決策では修正されませんでした。
Ubuntu 12.10 64-bitで ADT プラグイン バージョン v21.0.1-543035 を使用してEclipse 64-bitを実行しています。すべてが 64 ビット、Ubuntu、Eclipse、および私が使用する JRE と JDK (jdk1.6.0_38) です。
JDK のクラスを実行する必要がある非常に小さな Android アプリを作成しました。
問題を少し切り分けて、(onCreate メソッドのメイン クラスにある)コードを 1 行だけ使用して新しい「Android アプリケーション プロジェクト」を作成することで、問題を再現しました。この行:
BufferedImage buff = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
Eclipse は必要なインポートを自動的に追加します。
import java.awt.image.BufferedImage;
しかし、このクラスに jars/JRE を追加するように求められます。
jdk1.6.0_38 を「Installed JREs」で Eclipse に追加しました ( Eclipse ヘルプ ページで指示されているように)。
プロジェクトの「Java Build Path」で、「Add library」->「JRE system library」->「Workspace default 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」の「Default VM Arguments」を追加しました。
- 32 ビットの JRE と JDK、および JRE/JDK7 を使用しても (もちろん) 機能しませんでした。
- jdk jarファイルを手動で「libs」フォルダーに追加して、「ビルドパスに追加」をマークしようとしましたが、機能しませんでした。
- ADT と Android SDK を使用して Eclipse をアンインストールし、再度インストールしました...
この厄介なエラーを修正するものは何もありません...
次の点にも注意してください。
- .classpathファイルにデフォルトの JRE エントリが含まれていることを確認しました (ここで言うように)
- 「libs」フォルダー+「パスに追加」に他のjarファイルを追加して、それらを使用してみました-正常に機能しました。
- 「import java.awt.image.BufferedImage;」を使用して同じコード (1 行) を実行してみました。通常のJavaプロジェクト(Androidプロジェクトではない)で、プロジェクトを「デフォルトJREを使用」にしました-そして、うまくいきました!Android プロジェクトではなく、REGULAR Java プロジェクトで機能するのはなぜですか?
私のEclipseインストールにはjdkクラスを使用する機能がありますが、Androidアプリケーションでは使用できないことを意味していると思います。
では、この 1 行のコードをAndroid アプリケーションで実行するにはどうすればよいでしょうか。
どんな助けでも非常に高く評価されます。事前にサンクス。