2011-08-30 25 views
8

私はにandroid.jarをJavaプロジェクトに含めるようにしました。ビルドパスからJREを削除してこのコードを実行します。ランタイム例外をスローします。どうして?Javaプロジェクトでandroid.jarを使用しています - RuntimeException Stub?

Exception in thread "main" java.lang.RuntimeException: Stub! 
    at android.content.ContentValues.<init>(ContentValues.java:5) 
    at JarTest.main(JarTest.java:5) 

public class JarTest { 
    public static void main(final String[] args) { 
     final ContentValues values = new ContentValues(); 
     values.put("test", "test"); 
     System.out.println(values); 
    } 
} 

なぜAndroid環境でのみContentValuesが使用されますか?

答えて

16

SDKのandroid.jarには、SDKクラスのスタブ実装のみが含まれています。デバイス(またはエミュレータ)上にある実際の実装ではありません。 jarはクラスのメタデータを提供するだけで、SDKクラスを参照するアプリケーションが適切に構築されます。

Androidデバイスの外で実行されるandroid.jarを参照するプロジェクトは作成できません。

+0

他のJavaクラスがArrayListやVectorなどのように機能するのはなぜですか? – Emerald214

+1

@ Emerald214 JREクラスはクラスパス内になければならず、それらはスタブであってはいけませんが、アンドロイド固有のクラスはスタブです。それらはスケルトンなので、Java IDEを使ってアプリケーションをコード化してコンパイルできますが、コードは実際には存在しません。おそらくJavaで作成されていないものもあります。 – aalku

+0

誰でも実際のビルドがどこにあるのか知っていますか? –

5

android.jarには、@antlersoftが説明したように、プロジェクトを構築できるだけのスタブしか含まれていません。

Robolectricプロジェクトhttp://robolectric.org/を使用すると、デバイスを使用せずにAndroidコードでテストを実行できます。彼らは実際のビルドをMavenで利用できますhttp://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.robolectric%22

android-allアーチファクトを使用して、ほとんどのAndroidバックエンドコードを正常に実行しています。

一部のAPIはまだ範囲外ですが、Robolectricの成果物を含むjava.lang.RuntimeException: Stub!のその他のほとんどのケースで役立つはずです。

関連する問題