1

これが私がこれまでに行った手順ですが、運がありません。私はJavaプロジェクトに非常に慣れていないので、明らかな何かが欠けているのではないかと思います。

Eclipseを使用して、TestSDKという単純なJavaプロジェクトを作成し、その中にcom.test.testsdkというパッケージを作成し、その中に次のクラスを作成しました。

package com.test.testsdk;
public class TestClass {
    public void TestMethod() {
    }
}

これは、エラーや警告なしでコンパイルされます。

次に、Eclipseと標準のエクスポートオプション(生成されたクラスファイルとリソースのエクスポート、JARの内容の圧縮、マニフェストファイルの生成)を使用して、これをJARファイル(TestSDK.jar)としてエクスポートします。私はJARを封印することと封印しないことの両方を試しましたが、違いはありません。

次に、ウィザードリストの[ファイル]->[新規]->[プロジェクト]から新しいAndroidアプリケーションプロジェクトを作成します。これは、Androidエミュレーターとテストデバイスの両方で警告やエラーなしでコンパイルおよび実行されます(hello worldメッセージが表示されます)。

次に、TestSDK.jarファイルへの参照を追加し(後で拡張するため、さまざまなメソッドを使用して)、それをメインの(そして唯一の)Androidアクティビティにインポートし、TestClassをインスタンス化してTestMethodを呼び出します。そのようです:

package com.apptest.mobilesdktestapp;

import android.app.Activity;
import android.os.Bundle;

import com.test.testsdk.TestClass;

public class MobileSDKTestAppActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TestClass test = new TestClass();
        test.TestMethod();
    }
}

これは、警告やエラーなしで正常にコンパイルされます。ただし、エミュレータまたはデバイスで実行しようとすると、LogCatウィンドウに次のエラーが表示されます。

AndroidRuntime    Uncaught handler: thread main exiting due to uncaught exception
AndroidRuntime    java.lang.NoClassDefFoundError: com.test.testsdk.TestClass

WebでNoClassDefFoundError結果を検索すると、クラスパスが正しくなるようにJARファイルをインポートする方法に関する多くの提案が得られます。その結果、JARファイルをインポートする次のすべての方法を試しました。

  1. プロジェクトプロパティのJavaビルドパスの[ライブラリ]タブから[外部JARを追加...]をクリックし、[注文とエクスポート]タブでJARをチェックします(またはチェックしませんでした。両方を試しました)。また、JARを[注文とエクスポート]リストの一番上に移動してみましたが、違いはありませんでした。

  2. プロジェクトに「libs」フォルダーを作成し、そこにJARを追加します。その後、JARがプロジェクトリストの「AndroidDependencies」にも追加されることを確認しました。また、JARファイルを右クリックし、[ビルドパス]-> [ビルドパスに追加]を選択してみましたが、違いはありませんでした。

  3. JARをAndroidアプリケーションプロジェクトディレクトリに移動し、手順1のように外部JARの代わりに「JARを追加...」を実行します。また、エクスポートするかどうか、および注文リストの一番上に移動するかどうかのすべての順列。

その後、JARファイルとしてパッケージ化された他のサードパーティSDKをダウンロードし、それらをまったく同じAndroidアプリケーションプロジェクトに含めました。これらはすべて、上記の3つの方法のいずれかを使用して正常に機能しました(これらのSDKからクラスをインスタンス化して、エラーなしで)、これにより、TestSDKプロジェクトやクラスで何かが足りないか、何か間違ったことをしているため、Androidアプリケーションプロジェクトでの使用が妨げられていると思います。

私が言ったように、私はJavaに非常に慣れていないので、それが私が見落としていた単純なものであることを望んでいます。任意のヘルプやガイダンスをいただければ幸いです。

4

2 に答える 2

1

R17以降のバージョンのAndroidツールとEclipseのADTを使用している場合は、#2の最初の文が正解です。あなたの質問にリストされている他のすべては、せいぜい不要であるか、最悪の場合有害です。

クリーンなプロジェクトを作成し、テストアクティビティを作成し、フォルダーを作成しlibs/、JARをフォルダーにコピーlibs/し、JARのAPIにコーディングし、コンパイルして実行することをお勧めします。それがうまくいけば、あなたの元のプロジェクトには、あなたの悲しみを引き起こしているあなたの以前の努力からまだ残っているものがあります。それが失敗した場合、かなり奇妙なことが起こっています。JAR自体はおそらく問題ありません。そうでないと、コンパイルエラーが発生します。

于 2012-07-03T22:28:01.987 に答える
0

私は問題が何であるかを理解したと思います(または少なくとも問題を修正する方法、私はまだ私が何をしたのか100%確信していません)-

元のTestSDKJavaプロジェクトを作成したとき、プロジェクト作成ダイアログ(jre7)でデフォルトのJREをターゲットにしました。

新しいAndroidアプリケーションプロジェクトのプロジェクトプロパティを確認すると、Javaコンパイラセクションの「コンパイラコンプライアンスレベル」が1.5に設定されています。そこで、TestSDKプロジェクトを再作成しようとしましたが、実行環境としてdefalutjre7の代わりにJ2SE-1.5を使用するように指示しました。

これを行った後、JARをエクスポートしてAndroidプロジェクトのlibsディレクトリにインポートすると、TestSDKクラスをインスタンス化して、NoClassDefFoundError例外なしで問題なく使用できるようになります。

Androidアプリケーションが私のTestSDKクラス(JavaSE-1.7をターゲットにしていると私は信じています)よりも古いバージョンのJREに対してコンパイルされていたため、問題が発生したと推測されます。2つのバージョンを一致させることで解決しました。

于 2012-07-05T13:42:54.780 に答える