4

まず、私は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)

うまくいかなかった私が試したことは次のとおりです。

  1. 「 eclipse.ini 」にjdkの場所を追加します(「-vm /usr/lib/jvm/jdk1.6.0_38/bin」を2行に分けて)。
  2. パス「-Djava.library.path=/usr/lib/jvm/jdk1.6.0_38/jre/lib」の「Default VM Arguments」を追加しました。
  3. 32 ビットの JRE と JDK、および JRE/JDK7 を使用しても (もちろん) 機能しませんでした。
  4. jdk jarファイルを手動で「libs」フォルダーに追加して、「ビルドパスに追加」をマークしようとしましたが、機能しませんでした。
  5. ADT と Android SDK を使用して Eclipse をアンインストールし、再度インストールしました...

この厄介なエラーを修正するものは何もありません...

次の点にも注意してください。

  1. .classpathファイルにデフォルトの JRE エントリが含まれていることを確認しました (ここで言うように)
  2. 「libs」フォルダー+「パスに追加」に他のjarファイルを追加して、それらを使用してみました-正常に機能しました。
  3. 「import java.awt.image.BufferedImage;」を使用して同じコード (1 行) を実行してみました。通常のJavaプロジェクト(Androidプロジェクトではない)で、プロジェクトを「デフォルトJREを使用」にしました-そして、うまくいきました!Android プロジェクトではなく、REGULAR Java プロジェクトで機能するのはなぜですか?

私のEclipseインストールにjdkクラスを使用する機能がありますが、Androidアプリケーションでは使用できないことを意味していると思います。

では、この 1 行のコードをAndroid アプリケーションで実行するにはどうすればよいでしょうか。

どんな助けでも非常に高く評価されます。事前にサンクス。

4

1 に答える 1

8

では、この 1 行のコードを Android アプリケーションで実行するにはどうすればよいでしょうか?

簡単に言えば、何もできないということです。を含むフレームワーク全体java.awt.*は Android SDK の一部ではないBufferedImageため、エミュレーターや物理デバイスではサポートされていません。Android には、グラフィックスの読み込みとレンダリングのための独自の実装があります。

何が必要なのかを知らなければBufferedImage、どの代替案を検討すべきかを判断するのは困難です。おそらく、画像の個々のピクセルへのアクセスを含む、ある種の画像操作を行おうとしていますか? その場合は、BitmapBitmapFactoryクラスを見てください。

それはすべてに要約されJava SDK != Android SDKます。とにかく、ここでSOを検索することも検討してください。この間違いを犯したのはあなたが初めてではありません。

于 2013-01-03T03:22:27.110 に答える