在Eclipse中向Android项目添加外部jar包

4
我正在使用Eclipse构建一个简单的Android项目,该项目使用google-api-java-client。我试图遵循this tutorial来使其运行起来。我在SO上搜索了如何在Eclipse中向Android项目添加JAR的答案。大多数人建议将JAR添加到Android项目内部的lib/文件夹中,然后将这些JAR添加到项目的构建路径中。我已经完成了这两件事。该项目编译正常(无论如何,Eclipse没有抱怨任何错误)。但是当我在模拟器中运行Android应用程序时,每当我尝试实例化google-api-java-client JAR中的任何类时,都会出现ClassDefNotFoundError。例如
new com.google.api.client.http.apache.ApacheHttpTransport();

引发 ClassDefNotFoundError 错误。

这是导致错误的代码:

package com.mycom.android;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;

public class SearchRunner implements OnClickListener {

    private static final String API_KEY = "AIzaSyA1Mg3xWXfoov4HdPUzYY2NwTxuvCev1-E";
    private static final String PLACES_SEARCH_URL = "";

    @Override
    public void onClick(View v) {
        EditText editText = (EditText) v;
        String searchText = editText.getText().toString();
        runSearch(searchText);
    }

    protected void runSearch(String searchText) {
        new com.google.api.client.http.apache.ApacheHttpTransport();
    }

}

以下是来自Eclipse LogCat的更完整输出:
12-21 15:42:11.402: E/dalvikvm(3412): Could not find class 'com.google.api.client.http.apache.ApacheHttpTransport', referenced from method com.mycom.android.SearchRunner.runSearch
12-21 15:42:11.402: W/dalvikvm(3412): VFY: unable to resolve new-instance 70 (Lcom/google/api/client/http/apache/ApacheHttpTransport;) in Lcom/mycom/android/SearchRunner;
12-21 15:42:11.402: D/dalvikvm(3412): VFY: replacing opcode 0x22 at 0x0000
12-21 15:42:11.402: D/dalvikvm(3412): DexOpt: unable to opt direct call 0x00ca at 0x02 in Lcom/mycom/android/SearchRunner;.runSearch
12-21 15:42:11.682: I/MapActivity(3412): Handling network change notification:CONNECTED
12-21 15:42:11.682: E/MapActivity(3412): Couldn't get connection factory client
12-21 15:42:11.791: D/gralloc_goldfish(3412): Emulator without GPU emulation detected.
12-21 15:42:12.532: D/dalvikvm(3412): GC_CONCURRENT freed 102K, 3% free 10520K/10823K, paused 5ms+7ms
12-21 15:42:18.422: D/AndroidRuntime(3412): Shutting down VM
12-21 15:42:18.422: W/dalvikvm(3412): threadid=1: thread exiting with uncaught exception (group=0x409951f8)
12-21 15:42:18.482: E/AndroidRuntime(3412): FATAL EXCEPTION: main
12-21 15:42:18.482: E/AndroidRuntime(3412): java.lang.NoClassDefFoundError: com.google.api.client.http.apache.ApacheHttpTransport
12-21 15:42:18.482: E/AndroidRuntime(3412):     at com.mycom.android.SearchRunner.runSearch(SearchRunner.java:20)
3个回答

5
我按照这些说明一步一步地解决了问题。当我最初开始设置项目时:
  1. 我将来自google-api-java-client项目的JAR文件导入到我的项目的lib/文件夹中。
  2. 我右键单击lib/google-api-client...并选择构建路径>添加到构建路径。
此时,在Eclipse中,我的项目的“引用库”部分下出现了许多库。
jsr305-1.3.9.jar
gson-1.7.1.jar
guava-r09.jar
junit-4.8.2.jar
httpclient-4.0.3.jar
httpcore-4.0.1.jar
commons-logging-1.1.1.jar
commons-codec-1.3.jar
jackson-core-asl-1.9.1.jar
xpp3-1.1.4c.jar
protobuf-java-2.2.0.jar
google-http-client-1.6.0-beta.jar
google-oauth-client-1.6.0-beta.jar
google-api-client-1.6.0-beta.jar

然而,当我进入项目 > 属性 > Java构建路径 > 库时,我发现只列出了 google-api-client...。当我尝试运行该项目时,我得到了NoClassDefFounError错误,如原始帖子中所述,因为该类在 google-http-client 中定义!通过手动将 google-http-client 添加到构建路径中,问题得以解决。
教训是:仅因为JAR文件列在Eclipse项目的“引用库”下,并不意味着这些JAR文件包含在项目的构建路径中。

上面的链接非常有帮助。谢谢! - nathansizemore

0

也许是引入的问题?按下Ctrl+Shift+O会发生什么吗?

如果不行,我不确定你是否必须实例化正确的类来解决这个错误。


Ctrl+shift+o 添加缺失的导入语句。需要澄清的是,代码可以编译成功(没有缺失的导入语句)。 - maxenglander

0

是的,请将jar文件放置在lib文件夹中并将项目添加到构建路径(项目的属性部分)。Eclipse会在清理和构建后。您应该会看到正在使用的jar文件,因为它将出现在Android库下的“libraries”部分中。

要引用,请使用import some.package.com。正如letroll所说,ctrl+shift+o应该为您解决导入问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接